2011-09-14 7 views
2

私はasp.netプロジェクトを使ってファイルをサーバーにアップロードできます。元の名前でファイルを保存したいのですが、同じ名前のファイルが既に存在する場合はどうすればいいですか?括弧内に数字のファイル名を生成

ファイルは特定のフォルダにアップロードされ、クライアント側の名前自体とともに保存されます。したがって、myimage.jpgという名前のファイルがアップロードされていて、同じ名前のファイルがすでにサーバーに存在する場合は、myimage(1).jpgという名前に変更するか、 'myimage.jpg'から 'myimage(n).jpg 'が存在する場合は、その名前をmyimage(n + 1).jpgに変更する必要があります。

このようなファイル名を検索して生成する最もよい方法は何ですか?私の最初の推測はDirectoryInfo.EnumerateFiles()以上の正規表現でlinqを使用することでしたが、それは良いアプローチですか?

+0

これにはさまざまな方法があります。何を試しましたか? –

+0

Mineはちょっと醜いですが、linqを使って(ワイルドカード)パターンのファイル名(*).extを持つファイルを選択し、ファイル名の括弧の中にあるmax(number)を返します。 –

答えて

2
public static object lockObject = new object(); 
void UploadFile(...) 
{ 
    //-- other code 
    lock (lockObject) 
    { 
     int i = 1; 
     string saveFileAs = "MyFile.txt"; 
     while (File.Exists(saveFileAs)) 
     { 
      string fileNameWithoutExt = Path.GetFileNameWithoutExtension(saveFileAs); 
      string ext = Path.GetExtension(saveFileAs) 
      saveFileAs = String.Concat(fileNameWithoutExt, "(", i.ToString(), ")", ext); 
      i++; 
     } 

     //-- Now you can save the file. 
    } 
} 
+4

これはasp.netにあります。つまり、同じロジックを実行する複数のスレッドが存在します。存在の確認とファイルの保存はアトミックでなければなりません。 – Codism

+0

素晴らしい点、私は答えを更新しました。それは私のプロジェクトでこれに敏感な領域を見つけるのにも役立ちました。 –

+1

コードがサーバーファーム内で実行されている場合、ロックはファイルシステムやデータベースのようなグローバルな場所で行う必要があります。 – Codism

0

LINQや正規表現は必要ありません。

元のファイル名が存在する場合は、名前に(1)を追加します。
存在する場合は、元の名前に(2)を追加します。
など

5

元の名前のファイルをアップロード日時でソートする必要がない場合は、System.Guid.NewGuid()をToString()に追加するだけで済みます。ファイル名。

+0

GUIDの有用性を過小評価しないでください:) – Earlz

+0

これは非常に醜いファイル名になります。 – SLaks

+0

@SLaks:確かに。しかし、WhoaCoolPic(1357).jpgはそれほどきれいではありません:-) –

関連する問題