访问路径&c; \ $ Recycle.Bin \ S-1-5-18'被拒绝

时间:2014-03-18 09:17:16

标签: c# .net managementeventwatcher

我有这段代码将所有文件从源目录F:\复制到目标目录。

public void Copy(string sourceDir, string targetDir)
{
  //Exception occurs at this line.
    string[] files = System.IO.Directory.GetFiles(sourceDir, "*.jpg", 
                                             SearchOption.AllDirectories);

    foreach (string srcPath in files)
    {
       File.Copy(srcPath, srcPath.Replace(sourceDir, targetDir), true);
    }
}

并获得例外。

如果我省略SearchOption.AllDirectories并且它有效但只复制F:\

中的文件

4 个答案:

答案 0 :(得分:4)

使用以下函数代替System.IO.Directory.GetFiles:

IEnumerable<String> GetAllFiles(string path, string searchPattern)
    {
        return System.IO.Directory.EnumerateFiles(path, searchPattern).Union(
            System.IO.Directory.EnumerateDirectories(path).SelectMany(d =>
            {
                try
                {
                    return GetAllFiles(d,searchPattern);
                }
                catch (UnauthorizedAccessException e)
                {
                    return Enumerable.Empty<String>();
                }
            }));
    }

答案 1 :(得分:2)

文件系统对象受安全性限制。某些文件系统对象的安全性使得它们只能由某些用户访问。您遇到的文件执行代码的用户没有足够的权限来访问。

您对此特定文件夹没有访问权限的原因是为了保护系统上不同用户的安全。有问题的文件夹是该驱动器上的回收站。每个不同的用户都有自己的私人回收站,只有他们有权访问。如果有人可以访问任何其他用户的回收站,那么用户将能够读取彼此的文件,这明显违反了系统的安全策略。

也许最简单的方法是跳过驱动器根级别的隐藏文件夹。这个简单的改变足以解决您的问题,因为您肯定不想复制回收箱。

答案 2 :(得分:0)

该文件夹是一个安全的系统文件夹(您的bin,每个驱动器都有自己的bin)。只需将file.copy放入try catch语句中,然后忽略/记录所有失败。这样,您只会复制实际文件并跳过系统文件/文件夹。

如果你真的想避免使用try catch语句。使用fileinfo和目录信息类来确定系统中的文件夹/文件,并将引发异常。

答案 3 :(得分:0)

这应该可以解决问题:

private IEnumerable<string> RecursiveFileSearch(string path, string pattern, ICollection<string> filePathCollector = null)
{
    try
    {
        filePathCollector = filePathCollector ?? new LinkedList<string>();

        var matchingFilePaths = Directory.GetFiles(path, pattern);

        foreach(var matchingFile in matchingFilePaths)
        {
            filePathCollector.Add(matchingFile);
        }

        var subDirectories = Directory.EnumerateDirectories(path);

        foreach (var subDirectory in subDirectories)
        {
            RecursiveFileSearch(subDirectory, pattern, filePathCollector);
        }

        return filePathCollector;
    }
    catch (Exception error)
    {
        bool isIgnorableError = error is PathTooLongException ||
            error is UnauthorizedAccessException;

        if (isIgnorableError)
        {
            return Enumerable.Empty<string>();
        }

        throw error;
    }
}