У меня возникла проблема с службой мониторинга FTP и методом File.Move.
FTP-сервер - это простой FTP-сайт IIS 8.5, а FTP-клиент - FTP-клиент FileZilla
Служба Windows опросит каталог, в котором файлы должны быть удалены.
Первой задачей является переименование файла с использованием статического метода File.Move. Во-вторых, нужно скопировать файл в другой каталог, используя статический метод File.Copy.
Проблема заключается в том, что во время передачи файла File.Copy [правильно] выдает исключение IO, если оно используется, с сообщением "Файл используется другим процессом".
Однако File.Move выполнит эту задачу, не выдавая никаких исключений, пока файл все еще передается. Это правильное поведение для этого метода? Я не смог найти никакой информации о том, почему это происходит. Мое впечатление заключалось в том, что File.Move генерирует исключение, если оно используется в файле, используемом другим процессом [FTP Transfer], но это не похоже.
Кто-нибудь испытал это и/или объяснил поведение метода File.Move
Для копирования файла необходимо открыть его для доступа к чтению. В настоящее время на FTP-сервере открыт файл, поэтому вы не можете его открыть для чтения.
Перемещение файла не требует открытия его для доступа на чтение, если файл не находится на другом томе, чем место назначения.
Так как перемещение файла на тот же том требует только доступа для доступа, а не доступа для чтения, FTP-сервер должен блокировать файлы для чтения и записи, но не удалять.
Перемещение файла эффективно реализуется как простое переименование и требует только разрешения на запись в целевом и исходном каталоге. Для реальной копии вам нужны права на чтение самого файла. Поскольку в исходном файле есть исключительная блокировка, копия не удастся, однако переход будет успешным.
Этот код показывает, что 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);
}
Исключение:
Процесс не может получить доступ к файлу, поскольку он используется другим процессом.