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



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

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

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

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

问题是,在传输文件时,如果使用file.Copy,它将[正确地]引发IO异常,并显示消息"该文件正被另一个进程使用"。

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

是否有人经历过这种情况和/或对File.Move方法的行为有解释?

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

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

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

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

var filePath = @"d:publictemptemp.txt";
var moveToPath = @"d:publictemptemp2.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);
}

例外:

进程无法访问该文件,因为另一个进程正在使用该文件。

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

最新更新