Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试移动时,上载文件仍在使用*有时*_C#_Asp.net Mvc_File Upload - Fatal编程技术网

C# 尝试移动时,上载文件仍在使用*有时*

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循环不会被卡住,并且有一个超

将图像上载到我的服务器后,我的代码将其移动到用户详细信息提供的特定文件夹中。有时我认为它试图移动文件太快或上传文件仍在使用中,因此9/10功能无法执行移动

是否有方法添加“等待”或检查文件是否正在使用,并可能执行while循环,直到允许移动该文件

我的控制器中的当前移动功能:

while (!File.Exists(uploadedPath))
{
}
File.Move(uploadedPath, savePath);

另外,我打算添加一个计数器,以确保while循环不会被卡住,并且有一个超时

如果您可以控制接收文件的代码,我会更新它,以便在完全接收文件时通知移动代码。或者,我将从那里移动文件,甚至将文件保存到最终应该保存的位置

否则,这将是一次黑客攻击。你需要

  • 尝试移动文件
  • 捕获异常(如果它不移动)
  • 使用线程。睡眠几秒钟
  • 转到1
  • 大致如下:

    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。在这种情况下,即使我觉得处理异常也是一种方法。干杯