FTP 使用 File.Move 时的问题 - C#

FTP issue when using File.Move - C#

我遇到了 FTP 观察者服务和 File.Move 方法的问题。

FTP 服务器是一个简单的 IIS 8.5 FTP 站点,FTP 客户端是 FileZilla FTP 客户端

windows 服务将轮询要删除文件的目录。

第一个任务是重命名文件,使用静态 File.Move 方法。 第二,是使用静态File.Copy方法将文件复制到另一个目录。

问题是在传输文件时,如果使用 File.Copy 将 [正确] 抛出 IO 异常,并显示消息 "The file is being used by another process".

然而,File.Move 将执行它的任务,而不会在文件仍在传输时抛出任何异常。这是此方法的正确行为吗?我一直无法找到有关为什么会发生这种情况的任何信息。我的印象是,如果 File.Move 用于另一个进程正在使用的文件 [FTP 传输],它会抛出异常,但它似乎不会。

有没有人遇到过这种情况和/或对 File.Move 方法的行为有解释

这段代码表明,如果文件正在使用中,当您尝试移动它时,File.Move确实会抛出异常,所以我认为您的前提是不正确的。

var filePath = @"d:\public\temp\temp.txt";
var moveToPath = @"d:\public\temp\temp2.txt";

// Create a stream reader so the file is 'in use'
using (var fileStream = new StreamReader(filePath))
{
    // This will fail with an IO exception
    File.Move(filePath, moveToPath);
}

异常:

The process cannot access the file because it is being used by another process.

移动文件实际上只是重命名,只需要目标目录和源目录的写权限。对于真实副本,您需要对文件本身具有读取权限。由于源文件上有独占锁,复制会失败,但是移动会成功。

复制文件需要打开它进行读取访问。 FTP 服务器当前打开了文件,因此您无法打开它进行阅读。

移动文件不需要打开它进行读取访问,除非该文件位于与目标不同的卷上。

由于将文件移动到同一卷只需要删除访问权限而不需要读取访问权限,因此 FTP 服务器必须锁定文件以进行读取和写入,而不是删除。