我遇到了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方法的行为有解释
答案 0 :(得分:0)
此代码显示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);
}
例外:
该进程无法访问该文件,因为该文件正由另一个进程使用。
答案 1 :(得分:0)
移动文件实际上只是作为重命名实现,只需要对目标和源目录具有写权限。对于真实副本,您需要对文件本身具有读取权限。由于源文件存在独占锁定,因此副本将失败,但移动将成功。
答案 2 :(得分:0)
复制文件需要将其打开以进行读取访问。 FTP服务器当前打开文件,因此无法打开它进行读取。
移动文件不需要打开文件进行读取访问,除非文件与目标文件位于不同的卷上。
由于将文件移动到同一卷只需要删除访问而不是读取访问,因此FTP服务器必须锁定文件以进行读写,但不能删除。