3

次のコード行があります: (LINQ を使用)

//string folder <-- folder browser dialog.
listFiles = Directory.GetFiles(folder, "*.xml",
              SearchOption.AllDirectories).Select(
                    fileName => Path.GetFullPath(fileName)).ToList();

しかし、システム ファイルやシステム フォルダなど、開くことができない保護されたファイルをプログラムが検出することがあります。

どうすればこの問題を克服できますか:

開いている/空いているファイル フォルダーのファイル名のみを取得します。

4

3 に答える 3

8

わかりません。例外をキャッチする必要があります。

空きチェックを行っているときにファイルが空きであるが、処理中に使用中の場合はどうなりますか?

于 2013-05-17T16:27:56.557 に答える
4

それは問題になる可能性があります。ディレクトリを通過するときに例外がスローされると、停止します。

これらのディレクトリを無視して続行したい場合は、それを行うための再帰メソッドを作成する必要があります。

List<string> GetFiles(string folder, string filter)
{
    List<string> files = new List<string>();
    try
    {
        // get all of the files in this directory
        files.AddRange(Directory.GetFiles(folder, filter));
        // Now recursively visit the directories
        foreach (var dir in Directory.GetDirectories(folder))
        {
            files.AddRange(GetFiles(dir, filter));
        }
    }
    catch (UnauthorizedAccessException)
    {
        // problem accessing this directory.
        // ignore it and move on.
    }
    return files;
}

ややメモリ効率の良いバージョンは次のようになります。

    private List<string> GetFiles(string folder, string filter)
    {
        var files = new List<string>();

        // To create a recursive Action, you have to initialize it to null,
        // and then reassign it. Otherwise the compiler complains that you're
        // using an unassigned variable.
        Action<string> getFilesInDir = null;
        getFilesInDir = new Action<string>(dir =>
            {
                try
                {

                    // get all the files in this directory
                    files.AddRange(Directory.GetFiles(dir, filter));
                    // and recursively visit the directories
                    foreach (var subdir in Directory.GetDirectories(dir))
                    {
                        getFilesInDir(subdir);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                    // ignore exception
                }
            });

        getFilesInDir(folder);
        return files;
    }
于 2013-05-17T16:44:08.010 に答える
1

次のようなものを使用できますが、属性チェックを微調整する必要がある可能性があります。

Directory.GetFiles(folder, "*.xml", SearchOption.AllDirectories)
   .Select(fileName => new FileInfo(Path.GetFullPath(fileName)))
   .Where(n => !n.Attributes.HasFlag(FileAttributes.System))
   .Select(n => n.FullName)
   .ToList();
于 2013-05-17T16:36:29.070 に答える