C# .net筛选目录。仅保留逗号分隔字符串列表中包含的文件

C# .net筛选目录。仅保留逗号分隔字符串列表中包含的文件,c#,.net,vb.net,file-io,directory,C#,.net,Vb.net,File Io,Directory,我看了这么多问题,但都没用。我有一个大约10000个文件的目录。我想删除所有的参数,除了作为参数传入的参数。参数值为逗号分隔的文件名(不带路径),例如GMTEDC.dll、DirectoryInfo.xml、DBConnService.exe.config、DBConnService.exe、ComponentSpace.SAML.dll 除了参数中的以外,删除所有参数的最快方法是什么?仅使用这些文件创建现有目录的克隆也是一个选项。目标是将选定的文件保留在它们所在的所有不同文件夹中,并保留文件夹

我看了这么多问题,但都没用。我有一个大约10000个文件的目录。我想删除所有的参数,除了作为参数传入的参数。参数值为逗号分隔的文件名(不带路径),例如GMTEDC.dll、DirectoryInfo.xml、DBConnService.exe.config、DBConnService.exe、ComponentSpace.SAML.dll

除了参数中的以外,删除所有参数的最快方法是什么?仅使用这些文件创建现有目录的克隆也是一个选项。目标是将选定的文件保留在它们所在的所有不同文件夹中,并保留文件夹层次结构

我已经看过,但不知道如何让它完成我需要做的事情,而不是遍历每个文件,这需要花费很长时间。

示例:


使用System.Linq;
...
字符串[]filesNotDeleteByName=new[]{“filename1.etc”、“filename2.etc”,…};
DirectoryInfo yourDirectory=newdirectoryinfo(“[PATH\u TO\u YOUR\u DIRECTORY]”);
IEnumerable files=yourDirectory.EnumerateFiles().Where(fileInfo=>!fileNotDeleteByName.Contains(fileInfo.Name.ToLower());
foreach(文件中的FileInfo FileInfo)
{
//获取文件目录
DirectoryInfo fileDirectory=fileInfo.Directory;
fileInfo.Delete();
//删除空目录?
如果(!fileDirectory.EnumerateFiles().Any())
{
fileDirectory.Delete();
}
}

不管你的代码有多酷,它都会遍历每个文件来删除它。IO是这里的瓶颈,而不是代码。迭代10000个文件需要多长时间?如何在不迭代每个文件的情况下比较文件名?@paqogomez和Jonesy-GetFiles允许您发送搜索筛选器。我还没有尝试过,但我很确定我可以一次一个地传入每个文件名,并获得结果集合,我可以遍历该集合,并使用另一个文件夹中的文件重新创建该文件夹结构。我希望有一种方法可以同时传入所有文件或类似的内容。@bum-我没有确切的度量标准,因为我是在TFS构建中这样做的,所以我没有添加基准测试消息,但我应该也会这样做。我知道它需要改进,因为构建时间从1小时缩短到了3.5小时。谢谢。我试试看,然后告诉你。我想这对linq来说很容易做到,但这是一项技能,我不是黑带。linq和Lambda表达式是强大的函数。这仍然需要遍历每个文件。我认为这是一个更好的选择。最好遍历我需要的文件,使用getfiles获取匹配,使用addrange聚合它们,然后使用这些文件创建一个新的输出目录。然后删除原始输出目录,并将新目录重命名为输出目录。你怎么想?
using System.Linq;
...
string[] filesNotDeleteByName = new [] {"filename1.etc", "filename2.etc", ...};

DirectoryInfo yourDirectory = new DirectoryInfo("[PATH_TO_YOUR_DIRECTORY]");
IEnumerable<FileInfo> files = yourDirectory.EnumerateFiles().Where(fileInfo = > !fileNotDeleteByName.Contains(fileInfo.Name.ToLower()));

foreach(FileInfo fileInfo in files)
{
    // Get File Directory
    DirectoryInfo fileDirectory = fileInfo.Directory;

    fileInfo.Delete();

    // Delete Empty Directory ?
    if(!fileDirectory.EnumerateFiles().Any())
    {
        fileDirectory.Delete();
    }


}