2

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

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

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

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

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

4

2 回答 2

3

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

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

  1. 尝试移动文件,
  2. 如果它不移动,则捕获异常
  3. 使用 Thread.Sleep 几秒钟
  4. 转到 1

类似的东西:

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:

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

这意味着您的文件在移动后将保留在收到的文件目录中。

于 2013-05-01T04:09:50.967 回答
0

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

于 2013-05-01T04:49:33.847 回答