Установить файл как нечитаемый - PullRequest
2 голосов
/ 07 ноября 2011

Мне нужно записать некоторые данные во временный файл и сохранить этот файл в каталоге A. Для этого я использую метод File.createTempFile.Но есть поток, который периодически опрашивает каталог A, чтобы проверить, есть ли временные файлы для обработки.

// create a temporary file that will contain the data
newTmpFile = File.createTempFile("prefix", recoverFileExt, new File(
                recoverDirectory));
// the file is set to non readable, so the recovery thread cannot
// access it
newTmpFile.setReadable(false);

//write data into the file

// the file is written, it is set to readable so the recovery thread
// can now access it
newTmpFile.setReadable(true);

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

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

Спасибо

Ответы [ 5 ]

5 голосов
/ 07 ноября 2011

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

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

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

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

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

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

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

Создать индекс файлов

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

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

Этот индекс фактически будет рабочей очередью для потока восстановления.

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

ИМХО, это не способ сделать это.Используйте семафоры / мьютексы для управления синхронизацией потоков.Пытаться синхронизировать потоки с помощью файла - плохая привычка, которая приведет к большему количеству ошибок позже.

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