C# 尝试移动时,上载文件仍在使用*有时*
将图像上载到我的服务器后,我的代码将其移动到用户详细信息提供的特定文件夹中。有时我认为它试图移动文件太快或上传文件仍在使用中,因此9/10功能无法执行移动 是否有方法添加“等待”或检查文件是否正在使用,并可能执行while循环,直到允许移动该文件 我的控制器中的当前移动功能:C# 尝试移动时,上载文件仍在使用*有时*,c#,asp.net-mvc,file-upload,C#,Asp.net Mvc,File Upload,将图像上载到我的服务器后,我的代码将其移动到用户详细信息提供的特定文件夹中。有时我认为它试图移动文件太快或上传文件仍在使用中,因此9/10功能无法执行移动 是否有方法添加“等待”或检查文件是否正在使用,并可能执行while循环,直到允许移动该文件 我的控制器中的当前移动功能: while (!File.Exists(uploadedPath)) { } File.Move(uploadedPath, savePath); 另外,我打算添加一个计数器,以确保while循环不会被卡住,并且有一个超
while (!File.Exists(uploadedPath))
{
}
File.Move(uploadedPath, savePath);
另外,我打算添加一个计数器,以确保while循环不会被卡住,并且有一个超时 如果您可以控制接收文件的代码,我会更新它,以便在完全接收文件时通知移动代码。或者,我将从那里移动文件,甚至将文件保存到最终应该保存的位置 否则,这将是一次黑客攻击。你需要
bool success = false;
for (var count = 0; !success && count < 10; ++count)
{
try
{
File.Move(uploadedPath, savePath);
success = true;
}
catch (IOException)
{
Thread.Wait(1000);
}
}
bool success=false;
对于(变量计数=0;!成功计数<10;++计数)
{
尝试
{
Move(uploadedPath,savePath);
成功=真实;
}
捕获(IOException)
{
线程。等待(1000);
}
}
您还需要处理它根本无法移动文件的情况。因此,这是一种黑客行为,如果有其他方式通知移动代码,一般不应该这样做
另请注意:
从文件。移动msdn:
如果尝试跨磁盘卷移动文件,并且该文件正在使用中,
该文件将复制到目标,但不会从中删除
来源
这意味着您的文件在移动后将保留在received files目录中。是UploadFile和MoveFile两个相互独立的不同组件。如果是这样,我认为这不是一个好的架构。我会推荐一种方法,以便上传文件在完成部分后将控件传递给MoveFile。这样可以避免多个进程试图访问同一个文件。是否出现异常?如果是,是什么?另外,您如何更新该文件?如果以异步方式更新它,您所说的方式就是可能的。显示一些代码,如何保存文件。您可能无法正确处理已保存的文件。仅供参考,我收到的异常:
IOException未经用户代码处理-该进程无法访问该文件,因为它正被另一个进程使用。
我认为出现错误的原因是服务器试图在文件仍在使用/正在上载时过快地移动该文件。答案中概述的while循环解决了这个问题。这为我解决了这个问题。谢谢,当您每10次左右上传时就会看到两个文件夹(上传文件夹和目标文件夹),文件移动会有一点延迟,但这一次它不会被卡住,而是会重试移动并成功。谢谢。这将是首选,但我使用的平台使这很困难。上传在android设备上完成,该设备通过网络视图显示ASP.NET MVC。触发上传的方式是通过视图中的javascript完成的,该视图执行android JavascriptInterface函数,不幸的是,当访问控制器中的上传操作时,该函数来自不同的线程,不包含任何用户原始信息,这意味着移动路径将无法使用我想要的详细信息。确定。我现在明白这个问题了。但是MoveFile实际上是如何调用的呢?它是否一直在查看文件夹内容,并在找到图像文件后立即尝试移动图像文件?上面的问题已经解决,但为了澄清,我在触发上载之前创建了一个随机生成的字符串。上载图像的文件名设置为此字符串,并且在上载操作后触发movefile操作。因此movefile操作有一个while循环,等待查看文件是否存在,一旦文件存在(意味着它已成功上载),它就会将其移动到指定的路径。(在本例中,路径包含客户端用户名,以便对上载的文件进行排序)谢谢@BASmith。在这种情况下,即使我觉得处理异常也是一种方法。干杯