保存上传的文件 - 进程无法访问
Posted
技术标签:
【中文标题】保存上传的文件 - 进程无法访问【英文标题】:Saving an uploaded file - the process cannot access 【发布时间】:2012-07-08 17:58:39 【问题描述】:我有以下函数来处理上传的图片。
第一次尝试(重新启动 IIS 后)运行良好,但第二次尝试时我总是得到
进程无法访问该文件,因为它正被 另一个进程
现在,我确实知道文件以某种方式被 IIS 保持打开状态,但是如果我有,为什么会发生这种情况
newFile.Flush();
newFile.Close();
newFile.Dispose();
这是完整的功能:
private void SaveFile(HttpPostedFile file, string path)
Int32 fileLength = file.ContentLength;
string fileName = file.FileName;
byte[] buffer = new byte[fileLength];
file.InputStream.Read(buffer, 0, fileLength);
FileStream newFile = new FileStream(path, FileMode.Create, FileAccess.Write);
try
newFile.Write(buffer, 0, buffer.Length);
catch
finally
newFile.Flush();
newFile.Close();
newFile.Dispose();
更新:
经过几次检查,我确信除了w3wp.exe
这是 IIS 进程之外没有其他任何东西锁定文件。
【问题讨论】:
它不能回答你的问题,但可以解决你的问题。您是否尝试过在HttpPostedFile
上使用SaveAs 方法而不是创建新文件流?我不知道为什么它会有所帮助,但我怀疑提供SaveAs
方法可能有一个鬼鬼祟祟的原因......
我确实尝试过,但结果相同。
您是否正在处理传递给 SaveFile 函数的 HttpPostedFile 对象?
@Alex - 什么时候需要处理虚拟文件? O.o
@Dementic 它没有,这就是我问的原因。框架会处理这个问题,并且在极少数情况下手动处理它可能会导致问题。附带说明一下,catch
会在某些时候出现大量问题,我强烈建议将其删除(尝试...最后没有捕获就可以了)
【参考方案1】:
必须有其他东西保持文件打开 - 或者可能在第一次调用返回之前进行了第二次调用(在单独的线程上)。
顺便说一句,你最好这样写代码:
private void SaveFile(HttpPostedFile file, string path)
Int32 fileLength = file.ContentLength;
string fileName = file.FileName;
byte[] buffer = new byte[fileLength];
file.InputStream.Read(buffer, 0, fileLength);
using (FileStream newFile = new FileStream(path, FileMode.Create, FileAccess.Write))
newFile.Write(buffer, 0, buffer.Length);
【讨论】:
这仍然使文件保持锁定状态。 是的,因为持有锁的是别的东西。我只是想指出一种更好的方式来构建这部分代码。 好吧,我关闭了我的 AV,似乎没有其他东西在锁定文件,异常正是在这个函数上引发的......关于我如何找出锁定它的任何建议? 嗯,你可以试试technet.microsoft.com/en-us/sysinternals/bb896646,但它会产生非常多的输出。另外,检查文件的名称。是否可以使用与用于 HttpPostedFile 的名称相同的名称?以上是关于保存上传的文件 - 进程无法访问的主要内容,如果未能解决你的问题,请参考以下文章
无法访问保存在 Javascript 代码中的存储桶中的图像
该进程无法访问该文件,因为它正被另一个进程 Streamwriter 使用