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


Я хочу открыть файл для добавления на хосте Windows 7 с помощью C#/. NET. я хочу использовать обычные операции вывода файлов для этой цели. Я нашел такое решение:

FileStream trace_fd = new FileStream(r"c:temptestlog.txt", 
                                     FileMode.Append, 
                                     FileAccess.Write, 
                                     FileShare.ReadWrite)

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

FileStream good_logreader_fd = new FileStream("c:temptestlog.txt", 
                                              FileMode.Read, 
                                              FileAccess.Read,
                                              FileShare.ReadWrite)

Тогда у меня есть другая программа (багги log scanner) с такой строкой:

FileStream bad_logreader_fd = new FileStream("c:temptestlog.txt", 
                                             FileMode.Read, 
                                             FileAccess.Read, 
                                             FileShare.None)

Такая строка, очевидно, является ошибкой для сканера журналов. Если моя программа не работает, то багги logscaner получит эксклюзивную блокировку и последующие запуски моей программы не смогут получить fd для файла трассировки.

Мой вопрос в том, что я могу сделать, чтобы предотвратить такой ужасный сценарий. Например, можно ли установить права доступа к файлу трассировки, чтобы никто не мог получить монопольную блокировку? Если да, то как? Что-нибудь еще, что может защитить мою программу от ошибки сканера журнала? Обратите внимание, что я должен сохранить одно и то же имя файла трассировки между моей программой бежит.
2 2

2 ответа:

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

Разрешения предоставляют процессу (на основе учетной записи, под которой он выполняется) доступ к файлу/ресурсу. Если доступ предоставлен процесс может открыть файл с любым режимом общего доступа, который он желает. Если этот режим общего доступа не конфликтует с существующими режимами общего доступа, то запрос на файл завершается успешно и теперь файл будет иметь этот режим общего доступа (в сочетании с предыдущим). Подробнее см. раздел CreateFile - dwShareMode.

В вашем случае программа чтения журналов должна иметь разрешения на открытие файла, поэтому она сможет установить ShareMode.Нет, если это первый процесс, чтобы открыть файл. Как говорит devshorts, вы мало что можете сделать, кроме изменения нарушающего процесса или взлома методов доступа к файлам (поиск "hook CreateFile").

Примечание: Если ваш читатель журнала работает под той же учетной записью, что и другие процессы, разрешения не помогут по одной дополнительной причине - поскольку в Windows нет разрешений "для каждого процесса", и все процессы будут использовать одни и те же разрешения пользователя.

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