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

本文关键字:文件 文件夹 删除 过滤器 | 更新日期: 2023-09-27 18:05:24

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

要完全删除文件夹中的所有文件,我使用以下命令:

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()的什么?

有人可以帮助提供一个工作的例子吗?

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

如果需要一个新方法,只要不需要外部dll,就可以。

测试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();
        }
    }

使用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,因为您似乎只关心操作目录中的文件。

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

我想我有一个适合我的解决方案。在这里发布完整的代码,以便其他人可以使用它,调整它,和/或检查它可能的缺陷。这是我第一次使用StackOverFlow,知道我有这个可用的资源来搜索和提问的能力,人们可以实际帮助,这对我来说是一个很大的安慰,因为我是一个新的人所有这些东西。

谢谢大家!

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

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

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