我在MVC 3项目中上传了一个文件。
[HttpPost]
public ActionResult MyUpload(HttpPostedFileBase file)
{
string filePath = string.Empty;
string path = "C:\\";
string filePath = string.Empty;
try
{
if (file != null && file.ContentLength > 0)
{
filePath = path + file.FileName;
file.SaveAs(filePath);
file.InputStream.Dispose();
GC.Collect();
// other operations, where can occur an exception
// (because the uploaded file can have a bad content etc.)
}
}
catch (Exception e)
{
if (file.InputStream != null)
file.InputStream.Dispose();
GC.Collect();
if (!string.IsNullOrEmpty(filePath))
{
if (System.IO.File.Exists(filePath))
System.IO.File.Delete(filePath); //here is the error
}
}
}
在该代码中,如果我保存文件后发生异常,我无法删除它(我也无法再次上传)因为我收到了错误
该进程无法访问该文件 '[filePath]'因为它正由另一个进程使用。
该代码出了什么问题?
我必须将file.InputStream.Dispose();
更改为
file.InputStream.Close();
file.InputStream.Dispose();
file.InputStream = null;
而且,现在它工作正常。
答案 0 :(得分:0)
不应检查file.InputStream
块中catch
是否为空,而应将其置于finally
块内,如下所示:
if (file != null && file.ContentLength > 0)
{
try
{
filePath = path + file.FileName;
file.SaveAs(filePath);
// other operations, where can occur an exception
// (because the uploaded file can have a bad content etc.)
}
catch (Exception e)
{
if (!string.IsNullOrEmpty(filePath))
{
if (System.IO.File.Exists(filePath))
System.IO.File.Delete(filePath); //here is the error
}
}
finally
{
file.InputStream.Close();
file.InputStream.Dispose();
GC.Collect();
}
}
顺便说一句,InputStream
属性是只读属性。您无法将其设置为空。