2013-07-19 3 views
0

У меня есть много процессов, которые записывают файлы (любой файл может быть написан один раз). Они открывают, пишут и закрывают файлы. Также у меня есть много процессов, которые являются прочитанными файлами. Размер файла может быть различным. нужно такое: когда какой-то процесс пытается прочитать файл, который пишет в данный момент, мне нужно прочитать полный контент, когда файл закрыт после записи. Мне нужно заблокировать запись и ждать разблокировки при чтении. Важно: если файл читает файл и не может сделать это, он записывает файл сам по себе. 1. Попробуйте прочитать файл 2. Если файл не существует, напишите файлКак подождать, пока файл написан

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

+3

Вам это нужно на C# или на C++? –

+0

лучше C#. но я думаю, может быть любой – deeptowncitizen

ответ

1

Стандартный способ справиться с этой проблемой - записать имя файла temp, а затем переименовать файл, когда запись завершена.

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

+0

хорошая идея. но когда у меня будет большое количество читателей/писателей, будет много событий. количество файлов может быть> 1k – deeptowncitizen

2

Блокировка файлов - это специфическая операционная система.

Unix-подобные системы

Unix-подобные системы обычно поддерживают системные вызовы flock(), fcntl() и lockf(). Однако, кроме предупреждающих замков lockf, он не является частью стандарта Posix, поэтому вам необходимо проконсультироваться с документацией по конкретной операционной системе.

Документация для Linux здесь:

Обратите внимание, что fcntl() делает много вещей, а не только замок.

Обратите также внимание, что в большинстве случаев блокировка на unix-подобных системах является консультативной, т. Е. Совместными усилиями. Обе стороны должны участвовать и просто игнорировать блокировку - это возможность. Обязательная блокировка возможна, но не используется в типичной парадигме.

Окна

В окнах обязательные блокировки файлов (Share режим с CreateFile) и замки диапазона LockFileEx являются нормальными, и консультативные замки не доступны, хотя они могут эмулировать (как правило, с блокировкой диапазона в один байт на 0xffffffff или 0xffffffffffffffff - часть заблокированная не должна фактически существовать, поэтому это не означает, что файл такой большой).

Альтернативы

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

E.g. если файл будет называться «data-20130719-112258-99823.csv», вместо этого создайте одно имя «tmpdata-20130719-112258-99823.csv.tmp», а затем, когда оно будет полностью записано, переименуйте его.

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