如何只获取可以复制的文件?

时间:2013-05-17 16:22:22

标签: c# winforms file .net-3.5

我有这行代码:(使用LINQ)

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

但有时我的程序会找到受保护的文件,例如系统文件甚至无法打开的系统文件夹。

我怎样才能超越这个问题:

仅获取打开/免费文件夹的文件名。

3 个答案:

答案 0 :(得分:8)

你不能说,你只需抓住例外。

如果文件在进行免费检查时是免费的,但在处理时使用该怎么办?

答案 1 :(得分: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;
    }

答案 2 :(得分: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();