Добавляет ли файл в файл с Windows/NTFS?

Если я пишу простой текстовый файл журнала из нескольких процессов, могут ли они перезаписывать/повреждать записи друг друга?

(В принципе, этот вопрос Является ли файл append атомарным в UNIX?, но для Windows/NTFS.)

+3
источник поделиться
4 ответа

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

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

+2
источник

Вы можете получить атомарное дополнение к локальным файлам. Откройте файл с доступом FILE_APPEND_DATA (Документировано в WDK). Когда вы опускаете доступ FILE_WRITE_DATA, все записи будут игнорировать текущий указатель файла и выполняться в конце файла. Или вы можете использовать доступ FILE_WRITE_DATA, а для append write указывать его в перекрываемой структуре (Offset = FILE_WRITE_TO_END_OF_FILE и OffsetHigh = -1 Документировано в WDK).

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

+12
источник

Из этого Страница MSDN по созданию и открытию файлов:

Приложение также использует CreateFile, чтобы указать, хочет ли он делиться файлом для чтения, записи, обоих или ни одного. Это называется режимом совместного доступа. Открытый файл, который не является общим (dwShareMode установлен на ноль), не может быть снова открыт, либо приложением, которое его открыло, либо другим приложением, пока его дескриптор не будет закрыт. Это также называется эксклюзивным доступом.

и

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

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

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

+1
источник

Нет, это не так. Если вам это нужно, Transactional NTFS в Windows Vista/7.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос