排除包含子目录的目录?(Exclude directories that contain sub d

2019-10-17 06:30发布

我有以下代码:

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 ,它最终会在目标路径上创建此。

不能让它为档案工作:

//复制所有文件

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 ,它工作得很好,我想,但如果是下c:\App\Custom\sub1\sub2\thumbs.db ,它仍然会复制文件,自定义目录,这是我不想要的东西。 基本上,我需要得到正确下面的目录c:\App ,如果这是Custom ,然后我排除的文件。

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

当我运行下面的代码,通过我的所有文件循环,并把它们在目标目录中,我碰到一个目录未发现异常:

//Copy all the files
foreach (var file in files)
{
File.Copy(file.Name, file.FullName.Replace(environmentSettings.SourcePath, environmentSettings.TargetPath));
}

问题是,源文件可能像\网络\ APP1 \ one.mp3和我的目标目录可能是C:\ programdata \ MYAPP。 它说,它不能找到one.mp3复制从源文件时。 不知道如何处理这个问题。

Answer 1:

试试这个,如果这正好只是父文件夹和第一子文件夹:

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


文章来源: Exclude directories that contain sub directories?