Идентификация файла с использованием метаданных по разным путям - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть служба win, записывающая файл «a.txt» в папку «Input». Отсюда другой сторонний сервис просматривает файл и помещает его обратно после модификации в папку «Вывод». Используя имя файла «a.txt», я могу определить, что файл, помещенный во «Ввод», был обработан и получен «bny».

Моя проблема в том, что обновленные версии одного и того же файла могут быть записаны в «Вход», даже когда я жду, пока обработанная копия будет возвращена в «Выход». Таким образом, в таком случае, когда я нахожу «a.txt» в «Вывод», как мне определить, какая версия исходного файла это? Я пытался использовать свойство FileInfo.CreationTimeUtc, но это меняется на «Выход». Есть предложения?

Ответы [ 5 ]

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

Вы можете отслеживать каталог и хранить файл, который был помещен в Input, во второй каталог (если вы действительно не можете использовать тот же каталог) с измененным именем файла.

  1. Сторонний сохраненный файл на входе: a.txt
  2. Ваша программа распознает a.txt и скопирует его в Input / Queue / a.Timestamp.txt
  3. Ваша программа обработает каждый файл и скопирует его в выходной файл.

Если вы не можете использовать метку времени в выходном каталоге, вам придется подождать, пока файл из вывода тоже не будет обработан, поэтому вы не будете переопределять его.Проблема, которую я вижу в generell, заключается в том, что в файле a.txt нет блокировки или чего-то подобного.a.txt может быть написан дважды, и первая версия не будет обработана вообще.Как уже говорилось.Лучше было бы использовать какую-то очередь, не основанную на файлах, или более уникальные имена в Input.Даже если у вас нет прямого контроля над сторонней службой, это может быть большой проблемой ...

0 голосов
/ 09 ноября 2011

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

  • использовать один подкаталог на файл, если это поддерживается сторонней "службой"

ИЛИ

  • поддерживать «очередь» на имя файлавсякий раз, когда вы генерируете файл, вы сохраняете его с уникальным именем во временной папке, а не с «реальным» именем (согласно вашему соглашению об именах) ... вы поддерживаете коллекцию (словарь с «реальным» именем => запрос уникальногоnames) и «WorkItem» -List ... затем вы перемещаете уникальное имя в папку «Input» с его «реальным» именем и добавляете это имя в ваш «WorkItem» -List ..., когда этот файл появляется в вашемПапка «Вывод», затем вы удаляете ее из списка «WorkItem» и удаляете ее из очереди в Словаре ... «Переместить в папку ввода» всегда сначала проверяет, присутствует ли «настоящее» имя в «WorkItem»-Список, и если это так, он не перемещается.
0 голосов
/ 09 ноября 2011

Есть ли у вас контроль над сторонней службой, записывающей a.txt на выход? Если это так, FileInfo.CreationTimeUtc и для чтения, и для записи. После помещения файла в выходной файл может потребоваться время создания из обработанного файла и установить его для файла в выходном файле.

0 голосов
/ 09 ноября 2011

Если вы не контролируете сторонний инструмент, вам нужно контролировать только то, что вы можете - файл, который вы пишете. Если запись в «a.txt» вместо этого записывает в «a.timestamp.txt», вы можете увидеть, какие версии были обработаны.

0 голосов
/ 09 ноября 2011

Возможно, вы можете добавить дату и время к имени файла на выходе.

  1. Чтение входного файла и его CreationTimeUtc
  2. Запись выходного файла с именем a-CreationTimeUtc.txt

РЕДАКТИРОВАТЬ

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

...