Проблема с FTP при использовании File.Move - C #

1

У меня возникла проблема с службой мониторинга 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

3 ответа

0
Лучший ответ

Для копирования файла необходимо открыть его для доступа к чтению. В настоящее время на FTP-сервере открыт файл, поэтому вы не можете его открыть для чтения.

Перемещение файла не требует открытия его для доступа на чтение, если файл не находится на другом томе, чем место назначения.

Так как перемещение файла на тот же том требует только доступа для доступа, а не доступа для чтения, FTP-сервер должен блокировать файлы для чтения и записи, но не удалять.

  • 0
    Спасибо Гейб, эта информация также помогла мне
0

Перемещение файла эффективно реализуется как простое переименование и требует только разрешения на запись в целевом и исходном каталоге. Для реальной копии вам нужны права на чтение самого файла. Поскольку в исходном файле есть исключительная блокировка, копия не удастся, однако переход будет успешным.

  • 0
    То, как я читаю вопрос, это сервер, на котором происходит проблема, а не клиент, поэтому FileZilla не задействована.
  • 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);
}

Исключение:

Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню