Перемещение файлов из просматриваемой папки в С#

Я использую FileSystemWatcher, который использует событие Created для прослушивания, когда я копирую файлы в этот каталог. этот метод ниже:

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
   System.IO.Directory.Move(fileSystemWatcher1.Path+@"\"+e.Name, fileSystemWatcher1.Path + @"\Processing\"+e.Name);
}

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

есть идеи?

спасибо


person Aly    schedule 23.10.2010    source источник


Ответы (4)


Возможно, вам придется объединить несколько решений, чтобы это заработало.

  1. Когда событие срабатывает, запустите таймер на некоторое время (30 секунд?), чтобы успеть завершить создание файла. Затем переместите файл подальше.

  2. Перехватите ошибку и повторите попытку позже.

Или, когда файл прибывает, добавьте его имя в очередь, а затем создайте отдельный процесс, который перемещает файлы из очереди. В этом случае, если вы получите сообщение об ошибке «файл используется», вы можете просто прочитать файл в конце очереди, что даст ему больше времени для завершения.

person ChrisF    schedule 23.10.2010

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

Затем я переименовываю файл в его настоящее имя. Переименование занимает очень мало времени и не приводит к тому, что файл «используется».

person Dave Markle    schedule 23.10.2010

Возможно, вы могли бы сделать это, также прослушивая событие «Изменено» и пытаясь скопировать файл только после периода охлаждения. То есть после получения «Создано» подождите 5 секунд, прежде чем копировать файл, и сбрасывайте время на ноль каждый раз, когда вы получаете событие «Изменено».

person driis    schedule 23.10.2010

Я сделал это:

while(true){
  try
  {
     using (Stream stream = new FileStream("MyFilename.txt"))
     {
        break;
     }
  } catch {
     Thread.Sleep(1000);
  }
}

кажется, он делает свою работу

person Aly    schedule 23.10.2010