2010-11-19 45 views
0

我的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

也许你必须先冲洗()流? – Jocke 2010-11-19 08:49:17

+0

几个问题:是HttpPostedFileBase你自己实现的底层? (我注意到它在文档中是抽象的)。 FileIsSmallEnough的代码是什么?通常,如果问题点之上的一些自己的代码没有关闭/处置,并且被设计为保存文件句柄,则会出现此过程错误。 File静态助手类包含一些返回保存文件的对象的方法,例如,如果您不使用它们,如果GC在需要使用它之前将其清除,那么它就是好运气。 – 2010-11-19 09:02:20

+0

@Jocke:我也尝试了flush()。没有不同。 – duffy 2010-11-19 12:22:57

回答

2

正如您在评论中提到的那样,您可以从文件加载一个Image。 MSDN文档指出该文件保持锁定状态,直到图像被丢弃。

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

要处理你的形象,你可以调用实例上的Dispose方法,或者使用using语句的首选机制:

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

    } 
} 

这应该解决的问题。

+0

就是这样,谢谢! – duffy 2010-11-19 14:20:52