8

ソースディレクトリからすべてのファイル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

4 に答える 4

5

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>();
                }
            }));
    }
于 2015-02-19T16:22:50.077 に答える
2

ファイル システム オブジェクトはセキュリティの対象です。一部のファイル システム オブジェクトは、特定のユーザーのみがアクセスできるように保護されています。コードを実行しているユーザーが十分なアクセス権を持っていないファイルに遭遇しています。

この特定のフォルダへのアクセス権がないのは、システム上のさまざまなユーザーのセキュリティを保護するためです。問題のフォルダは、そのドライブのごみ箱です。また、それぞれのユーザーには、自分だけがアクセスできる専用のごみ箱があります。誰かが他のユーザーのごみ箱にアクセスできると、ユーザーは互いのファイルを読み取ることができ、システムのセキュリティ ポリシーに明らかに違反します。

おそらく、これを回避する最も簡単な方法は、ドライブのルート レベルにある隠しフォルダーをスキップすることです。ごみ箱をコピーしたくないので、この単純な変更で問題を解決できます。

于 2014-03-18T09:57:15.993 に答える
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;
    }
}
于 2019-12-12T14:38:55.933 に答える