【问题标题】:FTP issue when using File.Move - C#使用 File.Move 时的 FTP 问题 - C#
【发布时间】:2015-03-25 07:13:26
【问题描述】:

我在使用 FTP 观察服务和 File.Move 方法时遇到问题。

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

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

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

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

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

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

【问题讨论】:

    标签: c# ftp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这段代码表明,如果文件正在使用中,当你尝试移动文件时,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);
      }
      

      例外:

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

      【讨论】:

        【解决方案3】:

        移动文件被有效地实现为仅仅重命名并且只需要目标和源目录的写权限。对于真实副本,您需要对文件本身具有读取权限。由于源文件存在排他锁,因此复制会失败,但移动会成功。

        【讨论】:

        • 我阅读问题的方式,是发生问题的服务器,而不是客户端,因此 FileZilla 不涉及。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多