C# 是否排除包含子目录的目录?

C# 是否排除包含子目录的目录?,c#,.net-4.0,linq-to-objects,C#,.net 4.0,Linq To Objects,我有以下代码: var directories = Directory.GetDirectories( environmentSettings.SourcePath, "*", SearchOption.AllDirectories) .Where(dir => !environmentSettings.FolderExclusions .Contains

我有以下代码:

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

问题是源文件可能类似于\network\app1\one.mp3,而我的目标目录可能是c:\programdata\myapp。它说从源代码复制文件时找不到
one.mp3
。不确定如何处理此问题。

如果仅针对父文件夹和第一个子文件夹,请尝试以下操作:

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

我想这里的DirectoryInfo是dir.Parent…?太好了。这起作用了。你知道我怎样才能对文件做同样的事情吗。例如,当我执行Directory.GetFiles(source,“*”,SearchOption.AllDirectories)时,当遇到类似Custom\thumbs.dbIf的内容时,它会失败。如果成功,请将其标记为答案,如果有帮助,请进行投票:)关于文件:查看
FileInfo
-类及其提供的属性…我仍然不确定如何执行,我用一个尝试过的解决方案更新了我的帖子。如果父目录与根目录相同,则会失败,因为根目录没有父目录,并且父目录为空。关于最后一段:one.mp3实际上在\network\app1\one.mp3中吗?是的。这就是让人困惑的原因,但我正试图将它从\network\app1\one.mp3复制到c:\programdata\myapp\one.mp3Ahh-在这两种情况下,您都需要使用
File.FullName
…啊,就是这样,感谢您的帮助和耐心。我想听听你的意见。Microsoft.VisualBasic有一种方法可以复制direct的全部内容。讨论可以在这里找到(.你认为使用它更好吗?它有一个内置进度条的好处,但我不确定你是否可以排除文件夹/文件。我还有一个问题,我将在另一条评论中发表。再次感谢你在这方面的帮助。在我将所有文件夹复制到目标目录后。我在他们的
Cust上有一个文件夹有一些其他文件夹和文件的om
。我想从
自定义
中提取文件夹和文件,并将它们放在目标目录根文件夹中,然后删除
自定义
文件夹。在这种情况下,我应该使用移动或复制,然后删除吗?