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 回答