上传文件仍在使用中*有时*在尝试移动时

时间:2013-05-01 04:00:03

标签: c# asp.net-mvc file-upload

将图像上传到我的服务器后,我的代码会将其移动到用户详细信息所指定的特定文件夹中。有时我认为它试图移动文件太快或上传文件仍然在使用,所以9/10该功能将不会执行移动。

有没有办法添加'等待'或方法来检查文件是否正在使用并且可能执行while循环直到允许移动文件?

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

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

PS。我打算添加一个计数器,以确保while循环不会卡住并超时。

2 个答案:

答案 0 :(得分:3)

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

否则,它将是一个黑客。你需要

  1. 尝试移动文件,
  2. 如果不移动则抓住异常
  3. 使用Thread.Sleep几秒钟
  4. 转到1
  5. 有些事情:

    bool success = false;
    for (var count = 0; !success && count < 10; ++count)
    {
        try
        {
            File.Move(uploadedPath, savePath);
            success = true;
        }
        catch (IOException)
        {
            Thread.Wait(1000);
        }
    }
    

    当它根本无法移动文件时,您还需要处理这种情况。所以这是一个黑客攻击,如果有其他方法通知移动代码,则不应该这样做。

    另请注意:

    来自File.Move msdn:

      

    如果您尝试将文件跨磁盘卷移动并且该文件正在使用中,   该文件被复制到目标,但不会从中删除   源。

    表示移动后文件将保留在接收的文件目录中。

答案 1 :(得分:0)

UploadFile和MoveFile 2是彼此独立的不同组件。如果是这样,我认为这不是一个好的架构。我会推荐一种方法,以便一旦部分完成,上传文件将控件传递给MoveFile。这样,您可以避免多个进程尝试访问同一文件。