我的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
也许你必须先冲洗()流? – Jocke 2010-11-19 08:49:17
几个问题:是HttpPostedFileBase你自己实现的底层? (我注意到它在文档中是抽象的)。 FileIsSmallEnough的代码是什么?通常,如果问题点之上的一些自己的代码没有关闭/处置,并且被设计为保存文件句柄,则会出现此过程错误。 File静态助手类包含一些返回保存文件的对象的方法,例如,如果您不使用它们,如果GC在需要使用它之前将其清除,那么它就是好运气。 – 2010-11-19 09:02:20
@Jocke:我也尝试了flush()。没有不同。 – duffy 2010-11-19 12:22:57