2

我正在使用 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()也许?

有人可以通过提供一个工作示例来提供帮助吗?(最好是上面的修改版本,但是如果需要新的方法,只要不需要外部dll就可以了。

4

4 回答 4

3

只是测试看看是FileInfo.Name属性(字符串)StartsWith还是EndsWith指定的字符串。

    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();
        }
    }
于 2013-03-21T18:51:47.667 回答
3

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

于 2013-03-21T18:54:09.747 回答
0
if(!fi.Name.Contains("_blink"))
      fi.Delete();
于 2013-03-21T18:55:12.350 回答
0

我想我有一个适合我的解决方案。在此处发布完整代码,以便其他人可以使用、调整和/或检查可能存在的缺陷。这是我第一次使用 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_");
于 2013-03-23T01:26:17.410 回答