2011-10-11 101 views
2

我正在使用文件流來接收我的控制器中的大文件。下面的代碼:如何取消並刪除asp.net mvc 3中的上傳文件?

[HttpPost] 
public JsonResult Create(string qqfile, Attachment attachment) 
{ 
    Stream inputStream = HttpContext.Request.InputStream; 
    string fullName = ingestPath + Path.GetFileName(qqfile); 


    using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write)) 
    { 
     try 
     { 
      var buffer = new byte[1024]; 

      int l = inputStream.Read(buffer, 0, 1024); 
      while (l > 0) 
      { 
       fs.Write(buffer, 0, l); 
       l = inputStream.Read(buffer, 0, 1024); 
      } 
      return Json(new {success = "true"}); 
     } 
     catch (Exception) 
     { 
      return Json(new {success = "false"}); 
     } 
     finally 
     { 
      inputStream.Flush(); 
      inputStream.Close(); 

      fs.Flush(); 
      fs.Close(); 
     } 
    } 
} 

在我的頁面的ajax方法,我添加一個按鈕來取消文件上傳和刪除磁盤未完成的文件。 Ajax請求來命名的動作「取消」:

 [HttpPost] 
    public JsonResult Cancel(string filename) 
    { 
     string localName = HttpUtility.UrlDecode(filename); 
     string fullName = ingestPath + Path.GetFileName(localName); 
     if (System.IO.File.Exists(fullName)) 
     { 
      System.IO.File.Delete(fullName); 
     } 
     return Json(new {cancle = true}); 
    } 

的問題是:該文件不能刪除和異常消息是

該進程無法訪問該文件「E:\的TempData \ filename_xxx.xxx「,因爲它正在被另一個進程使用。

我認爲這是因爲該文件的文件流沒有關閉。如何關閉此文件流並在「取消」操作中刪除文件?

-

OH!我找到了一種方法來解決它。

using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write)) 

這是簡單,只要申報文件共享屬性:FileShare.Delete

using (var fs = new FileStream(fullName, FileMode.Append, FileAccess.Write, FileShare.Delete)) 

我花了4小時,谷歌和調試和測試,並試圖解決它。在我問了一個stackoverflow後10分鐘,我自己得到了答案。有趣!並希望它對某人也有用。

+0

我剛剛學會了如何使用system.io.file.Thanks刪除文件夾中的文件以便查詢 – bhargav

回答

0

您可以將該文件流放入會話中,然後在取消操作中使用該會話來關閉流。

+0

感謝您的回答。問題是我錯過了設置文件共享屬性。我在我的問題下面添加了我的答案。 – workingbird

+0

無論如何,這是一個更好的解決方案。工作很好。 –