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)

各ファイルとディレクトリを繰り返し処理し、一致するフィルターを一度に1つずつ確認し、一致しない場合は削除する必要があると思いますが、その方法がわかりません。

何かと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 に答える