2010-10-23 3 views
0

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

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

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

Любые мысли?

благодаря

ответ

2

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

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

2

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

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

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

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

1

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

1

Я сделал это:

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

, кажется, чтобы сделать работу

Смежные вопросы