2010-11-19 8 views
0

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

+0

ストリームを最初にflush()する必要がありますか? – Jocke

+0

質問のカップル:HttpPostedFileBaseはあなた自身の実装ですか? (私はそれがドキュメントの抽象であることに気づいた)。 FileIsSmallEnoughのコードは何ですか?通常は、問題点の上にある自分のコードのいくつかが閉じられていない/処理されておらず、ファイルハンドルを保持するように設計されている場合、このプロセスエラーが発生します。 File静的ヘルパークラスには、ファイルを保持するオブジェクトを返すメソッドがいくつかあります。たとえば、これらを破棄しないと、GCを使用する前にGCがクリアされた場合、そのファイルは破棄されます。 –

+0

@Jocke:私はflush()も試みました。変わりはない。 – duffy

答えて

2

コメントに記載されているとおり、ファイルからImageをロードします。 MSDNドキュメントには、イメージが破棄されるまでファイルがロックされたままであることが記載されています。

private bool FileIsSmallEnough() 
{ 
    using (Image i = Image.FromFile()) 
    { 

    } 
} 

これは、問題を解決する必要があります:

http://msdn.microsoft.com/en-us/library/stf701f5.aspx

は、インスタンス上で Disposeメソッドを呼び出し、または using文の推奨メカニズムを使用するか、あなたの画像を配置します。

+0

それは、ありがとう! – duffy

関連する問題