2

最近、6 つのディレクトリにある一連のファイルの名前を変更する小さなプログラムを作成しました。プログラムは、リストから各ディレクトリをループし、File.Move メソッドを使用してそのディレクトリ内の各ファイルの名前を変更します。ファイルの名前は、毎回 1 が 1 ずつ増加して、cart_buttons_1.png に変更されます。

public static int RenameFiles(DirectoryInfo d, StreamWriter sqlStreamWriter, 
                                       int incrementer, int category, int size)
{
    FileInfo[] files = d.GetFiles("*.png");

    foreach (FileInfo fileInfo in files)
    {
        File.Move(fileInfo.FullName, d.FullName + "cart_button_" + incrementer + ".png" );
        incrementer++;
    }

    return incrementer;
}

私が遭遇している問題は、プログラムを複数回実行すると、100 番目のレコードを含むフォルダーに到達するまで正常に実行されることです。d.Getfiles メソッドは、名前を変更しようとしているファイルが既にフォルダーに存在するため、最初に 100 番台のすべてのファイルを取得し、IOException を引き起こします。これに対して私が見つけた回避策は、ファイル名に 100 を含むすべてのレコードを選択し、それらの名前をすべて「z」などに変更して、それらをすべてまとめてバッチ処理することです。これを修正する方法についての考えやアイデア。おそらく、GetFiles を並べ替えて、他のものを最初に確認する方法です。

4

2 に答える 2

1

LINQ の使用:

var sorted = files.OrderBy(fi => fi.FullName).ToArray();

上記はテキスト値でソートされることに注意してください。したがって、数値でソートするように変更することもできます。

files.OrderBy(fi => int.Parse(fi.Name.Split(new []{'_','.'})[2]))

上記は、ファイル名で分割する_.、3 番目の値が数値である配列になると想定しています。

于 2012-09-11T15:27:29.997 に答える
0

最も簡単な回避策は、コピーを試みる前に宛先名が存在するかどうかを確認することです。配列は既にあるのでfiles、宛先名を作成できます。File.Exists() が true を返した場合は、その数値をスキップします。

File.Move によってスローされる例外も処理します (不必要な例外のスローを避けるために、最初に存在をテストする必要があります)。これは、コードが動作している間はファイル システムが凍結されていないためです。その間に作成されないようにしてください。

最後に、同じディレクトリに対してこのコードを再度実行すると、すべてのファイルが再び複製されると思います...おそらく意図したものではありません。ソース ファイル名をフィルタリングし、既にパターンに一致するものをコピーしないようにします。

于 2012-09-11T15:28:53.987 に答える