FileSystemWatcher Работа завершена? - PullRequest
2 голосов
/ 12 января 2011

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

Если бы я использовал Windows Explorer для копирования файлов из одного каталога в другой, Explorer сказал бы мне, что на передачу осталось n секунд, так что, хотя есть некоторые действия для начала и конца передачи для каждого файла похоже, что есть что-то для начала и конца передачи для всех файлов.

Интересно, есть ли что-то подобное, что я могу сделать только с .NET Framework? Я хотел бы знать, когда «все» файлы находятся, а не только один файл в «транзакции». Если ничего не выпекается, возможно, мне следует придумать какое-то ожидание / противодействие, чтобы выполнять свою деятельность только тогда, когда работа «выполнена».

Не уверен, что я правильно понял этот вопрос, пожалуйста, прокомментируйте.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 12 января 2011

Способ, которым я реализовал это в прошлом, - это иметь файл «маркера» со специальным именем, например, 'конец'. Этот файл всегда является последним записанным файлом и служит индикатором завершения многофайловой транзакции. Это будет прекрасно работать, если только один поток записывает эти наборы файлов.

Если существует много потоков, каждый из которых может записывать набор файлов, вам необходимо каким-то образом связать каждый «конечный» файл с набором файлов, которые он помечает. Один из способов сделать это - включить GUID (или какой-либо другой уникальный идентификатор) в имена файлов, например,

{ GUID1 .file1.bin, GUID1 .file2.bin, GUID1 .end}

{ GUID2 .file1.bin, GUID2 .file2.bin, GUID2 .end}

Еще один способ сделать это - сжать все файлы из каждого набора в один ZIP-файл, так что вам нужно только следить за отдельными файлами.

1 голос
/ 12 января 2011

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

Исследователь может сделать это, потому что он знает, что вы хотите сделать (скопируйте эти x-файлы здесь).

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

Уловка файла .end, о которой упоминает AdamRalph, является единственной уловкой, которая фактически приближается к тому, что вы хотите сделать.

чч

Марио

0 голосов
/ 12 января 2011

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

Если бы я реализовал что-то подобное, я бы, вероятно, использовал бы какое-нибудь имя файла, например ~<ANOTHER-UNIQUE-GUID>.tmp, мой наблюдатель файловой системы наблюдал бы за одним файлом с таким именем формата, который, в свою очередь, велит другому наблюдателю файловой системы ждать файлы, перечисленные внутри. После удаления файлов временный файл может быть удален.

Такой подход может быть легко реализован, так что каждый из ваших наблюдателей не будет перебирать друг друга и передавать / удалять файлы, над которыми работают другие наблюдатели.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...