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

问题描述:

我遇到FTP观察器服务和File.Move方法的问题。使用File.Move时出现FTP问题 - C#

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

Windows服务将轮询的目录中的文件将被删除。

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

问题是,当文件正在传输时,File.Copy将正确地抛出一个IO异常(如果使用的话),并显示消息“该文件正在被另一个进程使用”。

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

有没有人经历过这种和/或拥有的File.Move方法的行为的解释

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

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

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

+0

谢谢加贝,这些信息也帮助我 – polydegmon 2015-03-25 16:31:02

此代码表明,当您尝试移动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); 
} 

例外:

,因为它被另一个进程的进程不能访问该文件。

移动文件有效地实现为单纯重命名,只需要在目标和源目录上写入许可。对于真正的副本,您需要读取文件本身的权限。由于源文件上存在独占锁,所以副本将会失败,但是移动将会成功。

+0

我读到这个问题的方式,是发生问题的服务器,而不是客户端,所以FileZilla没有影响。 – Gabe 2015-03-24 22:28:17

+0

这是有道理的,谢谢你的信息雅科 – polydegmon 2015-03-25 16:30:26