排除包含子目录的目录?

时间:2012-09-28 19:52:30

标签: c# .net-4.0 linq-to-objects

我有以下代码:

var directories =  Directory.GetDirectories(
        environmentSettings.SourcePath, 
        "*",
        SearchOption.AllDirectories)
    .Where(dir => !environmentSettings.FolderExclusions
                                      .Contains(Path.GetFileName(dir)));

我想在目标路径中创建一个目录,但在排除列表中显示的目录除外。这是有效的,但前提是该目录直接位于根目录下且不包含子目录。

例如,如果排除列表包含名为Custom的目录且根目录为C:\App,则它将排除C:\App\Custom而不在目标路径中创建它,但是遇到像C:\App\Custom\Sub之类的东西,它最终会在目标路径上创建它。

无法让它适用于File:

//复制所有文件

var files = Directory.GetFiles(environmentSettings.SourcePath, "*", SearchOption.AllDirectories)
      .Select(file => new FileInfo(file))
      .Where(file => !environmentSettings.FolderExclusions
                                         .Contains(file.Name) && 
                     !environmentSettings.FolderExclusions
                                         .Contains(file.Directory.Name));

上面的问题是,我不知道如何判断文件的嵌套方式,例如,如果文件位于c:\App\Custom\thumbs.db之下,我认为它可以正常工作,但如果它位于{{ 1}},它仍然复制文件和自定义目录,这是我不想要的。我基本上需要将目录放在c:\App\Custom\sub1\sub2\thumbs.db下面,如果是c:\App,那么我会排除该文件。

Custom

当我运行以下代码循环遍历所有文件并将它们放在目标目录中时,我遇到了一个找不到Directory的异常:

var files = Directory.GetFiles(environmentSettings.SourcePath, "*", SearchOption.AllDirectories)
            .Select(file => new FileInfo(file))
            .Where(file => !environmentSettings.FolderExclusions.Contains(file.Directory.Name) && (file.Directory.Parent == null || !environmentSettings.FolderExclusions.Contains(file.Directory.Parent.Name)));

问题是源文件可能类似\ network \ app1 \ one.mp3,我的目标目录可能是c:\ programdata \ myapp。它说它在从源复制文件时找不到//Copy all the files foreach (var file in files) { File.Copy(file.Name, file.FullName.Replace(environmentSettings.SourcePath, environmentSettings.TargetPath)); } 。不知道如何处理这个。

1 个答案:

答案 0 :(得分:3)

如果仅适用于父文件夹和第一个子文件夹,请尝试此操作:

var directories =  Directory.GetDirectories(environmentSettings.SourcePath, "*", SearchOption.AllDirectories)
    .Select(dir => new DirectoryInfo(dir))
    .Where(dir=>!excludes.Contains(dir.Name) && (dir.Parent == null || !excludes.Contains(dir.Parent.Name)));

要使用文件启用此功能,请尝试以下

var files = Directory.GetFiles(sourcePath, "*", SearchOption.AllDirectories)
    .Select(file => new FileInfo(file))
    .Where(file=>!excludes.Contains(file.Directory.Name) && (file.Directory.Parent == null || !excludes.Contains(file.Directory.Parent.Name)));