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

本文关键字:复制 文件 获取 | 更新日期: 2023-09-27 18:14:20

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

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

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

我怎样才能超越这个问题呢?

只获取打开/free文件文件夹的文件名

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

你不知道,你只需要捕捉异常。

如果文件在做自由检查时是空闲的,但在处理时正在使用,该怎么办?

这可能是个问题。如果在遍历目录时抛出异常,则停止。

如果你想忽略这些目录并继续,你必须写一个递归方法来做到这一点:

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;
    }

你可以使用这样的东西,可能你需要调整属性检查:

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();