My Asp.net MVCアプリケーションにはファイルのアップロードが必要です。アップロードの過程で、新しくアップロードされたファイルを操作したいと思います。もちろんアップロードしたばかりのファイルを操作するとIOExceptionが発生します
public ActionResult Edit(int id, FormCollection collection) {
Block block = userrep.GetBlock(id);
foreach (string tag in Request.Files) {
var file = Request.Files[tag] as HttpPostedFileBase;
if (file.ContentLength == 0)
continue;
string tempfile = Path.GetTempFileName()
file.SaveAs(tempfile);
// This doesn't seem to make any difference!!
// file.InputStream.Close();
if (FileIsSmallEnough(file)) {
// Will throw an exception!!
File.Move(tempfile, permanentfile);
} else {
GenerateResizedFile(tempfile, permanentfile);
// Will throw an exception!!
File.Delete(tempfile);
}
block.Image = permanentfile;
}
userrep.Save();
このスニペットに問題が最初にアップロードされたファイルを操作するためのあらゆる試みはIOExceptionが発生していることである(「それは別のプロセスによって使用されているため、プロセスはファイルにアクセスできません。」)私はバイパスすることができますアップロードされたファイルを移動するのではなく、コピーすることで問題が発生しますが、一度削除すれば削除できません。
アドバイスはありますか? Duffy
ストリームを最初にflush()する必要がありますか? – Jocke
質問のカップル:HttpPostedFileBaseはあなた自身の実装ですか? (私はそれがドキュメントの抽象であることに気づいた)。 FileIsSmallEnoughのコードは何ですか?通常は、問題点の上にある自分のコードのいくつかが閉じられていない/処理されておらず、ファイルハンドルを保持するように設計されている場合、このプロセスエラーが発生します。 File静的ヘルパークラスには、ファイルを保持するオブジェクトを返すメソッドがいくつかあります。たとえば、これらを破棄しないと、GCを使用する前にGCがクリアされた場合、そのファイルは破棄されます。 –
@Jocke:私はflush()も試みました。変わりはない。 – duffy