C#用过滤器删除文件夹中的文件

时间:2013-03-21 18:46:20

标签: c# filter delete-file

我正在使用SharpDevelop编写一个C#程序(而不是控制台)。 我想删除指定目录中的文件,但能够EXCLUDE开头,结尾或包含某些单词的文件。

要完全删除我正在使用的文件夹中的所有文件:

private void clearFolder(string FolderName)
{
    DirectoryInfo dir = new DirectoryInfo(FolderName);

    foreach(FileInfo fi in dir.GetFiles())
    {
        fi.Delete();
    }

    foreach (DirectoryInfo di in dir.GetDirectories())
    {
        clearFolder(di.FullName);
        di.Delete();
    }
}

我像

一样使用它
ClearFolder("NameOfFolderIWantToEmpty");

有没有办法修改这个以便我可以删除所有文件和目标除了那些包含特定单词的文件和目录?

类似的东西:

CleanFolder(FolderToEmpty,ExcludeAllFileAndDirectoriesContaingThisPhrase);

所以,如果我做了

CleanFolder("MyTestFolder","_blink");

它不会删除名称为

的文件和目录
_blinkOne (file)

Test_blineGreen (file)

Test_blink5 (directory)

_blinkTwo (file within the Text_blink5 directory)

Folder_blink (empty directory)

但是要删除像

这样的文件和目录
test (file)

test2 (directory)

test3_file (file within test2 directory)

test4 (empty directory)

我怀疑我可能必须遍历每个文件和目录,一次检查一个匹配过滤器,如果不匹配则删除它,但我不知道该怎么做。

可能是FileInfo()DirectoryInfo()的某些内容?

有人可以提供一个有效的例子吗? (上面的修改版本是首选,但如果需要新方法,只要它不需要外部dll,就可以。

4 个答案:

答案 0 :(得分:4)

使用Directory.GetFiles(string, string)方法获取匹配您的模式的文件列表,并使用Enumerable.Except(IEnumerable<T>)获取您确实要删除的文件。

string pattern = *.*;
var matches = Directory.GetFiles(folderName, pattern);
foreach(string file in Directory.GetFiles(folderName).Except(matches))
    File.Delete(file);

这里不需要使用DirectoryInfo,因为您似乎只关心操作目录中的文件。

答案 1 :(得分:2)

只需测试FileInfo.Name属性(字符串)StartsWithEndsWith是否为指定的字符串。

    foreach (FileInfo fInfo in di.GetFiles())
    {
        if (!fInfo.Name.StartsWith("AAA") || 
            !fInfo.Name.EndsWith("BBB"))
        {
            fInfo.Delete();
        }
    }

或者,如果您要在文件名中的任何位置查找单词,请使用Contains方法:

    foreach (FileInfo fInfo in di.GetFiles())
    {
        if (!fInfo.Name.Contains("CCC")) 
        {
            fInfo.Delete();
        }
    }

答案 2 :(得分:0)

if(!fi.Name.Contains("_blink"))
      fi.Delete();

答案 3 :(得分:0)

我想我有一个适合我的解决方案。 在此处发布完整代码,以便其他人可以使用它,调整它,和/或检查它是否存在可能的缺陷。 这是我第一次使用StackOverFlow,并且知道我有可用于搜索的资源以及提问和人们可以提供帮助的能力,对于我来说,作为一个对所有这些东西都不熟悉的人来说,这是一个很大的安慰。 p>

非常感谢大家!

//递归搜索目录并删除所有子目录和文件

//名称不包含给定的搜索模式

private void clearFolderWithFilter(string folderName, string filesToExclude)
{
    DirectoryInfo dir = new DirectoryInfo(folderName);

    foreach(FileInfo fi in dir.GetFiles())
    {
        if(!fi.Name.Contains(filesToExclude))
        {
            // System.Diagnostics.Debug.WriteLine("DELETING file " + fi + " because it does NOT contain '" + filesToExclude + "' ");
            fi.Delete();
        } else {
            // System.Diagnostics.Debug.WriteLine("SAVING file " + fi + " because it contains '" + filesToExclude + "' ");
        }
    }

    foreach (DirectoryInfo di in dir.GetDirectories())
    {
        if(!di.Name.Contains(filesToExclude))
        {
            // System.Diagnostics.Debug.WriteLine("DELETING directory " + di + " because it does NOT contain '" + filesToExclude + "' ");
            clearFolderWithFilter(di.FullName, filesToExclude);
            di.Delete();
        } else {
            // System.Diagnostics.Debug.WriteLine("SAVING directory " + di + " because it contains '" + filesToExclude + "' ");
        }
    }
}

用法:

clearFolderWithFilter(@"C:\Path\MyFolder","DoNotDelete_");