Блокировка файлов на локальной ФС - PullRequest
1 голос
/ 07 февраля 2012

Я создаю Java-приложение для обработки файлов на локальной ФС (NTFS, но было бы неплохо решение, которое в будущем позволило бы легко расширить файловые системы Linux). Проблема заключается в том, что один файл не может быть обработан более одного раза в случае одновременной работы двух экземпляров (процессов) моего приложения.

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

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

Другие трюки для достижения того, что мне нужно, также приветствуются.

Ответы [ 3 ]

3 голосов
/ 07 февраля 2012
1 голос
/ 07 февраля 2012

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

  1. Получить список файлов для каждого файла:
  2. Попробуйте переименовать файл
  3. Если переименование выполнено успешно - работа с файлом
  4. Если переименовать не удалось - не работает с файлом
  5. Получил 2
0 голосов
/ 07 февраля 2012

Примерно так должно работать:

File someFile = new File(path);
if ( !someFile.getName().endsWith(".locked") ) {
    File lockedFile = new File(someFile.getAbsolutePath() + ".locked");
    someFile.renameTo(lockedFile);
}
...