MFC C ++: как заблокировать файл, который будет использоваться только в моем процессе? - PullRequest
0 голосов
/ 26 сентября 2011

Я хотел бы заблокировать пару файлов, которые будут использоваться только моим процессом, и запретить доступ любого другого приложения к этим файлам во время работы моей программы. Конечно, я знаю, что могу получить эксклюзивный доступ к файлу с помощью Createfile, но мое приложение работает по-другому, я читаю кучу имен файлов из конфигурации config и обрабатываю эти файлы с помощью библиотеки Lib, связанной с моим приложением, т.е. одной из функций в моем lib получает доступ к файлам, но я не получаю взамен filoehandle или что-то подобное.

Итак, я хочу получить то, что пока мое приложение обрабатывает эти файлы, никакое другое приложение не может их изменить. Это как-то возможно? Я занимаюсь разработкой с использованием MFC в Visual Studio 8.

Ответы [ 4 ]

2 голосов
/ 26 сентября 2011

Я никогда не использовал их, но LockFile/LockFileEx документы говорят: Блокирует указанный файл для монопольного доступа вызывающим процессом.

1 голос
/ 01 октября 2011

То, что вы просите, не может быть сделано.

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

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

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

1 голос
/ 28 сентября 2011

Почему исключительный флаг CreateFile () не достигает этого? Похоже, тебе ничего не нужно. Если ваша библиотека открывает файл с помощью CFile :: shareDenyRead и CFile :: shareDenyWrite, никакой другой процесс не сможет читать ваши файлы, если они открыты вашей библиотекой.

1 голос
/ 26 сентября 2011

Вам необходимо сотрудничество с ОС, потому что это единственный способ влиять на другие процессы.

ОС требует использования дескрипторов для ссылки на файлы.Это действительно единственный практический способ для ОС;использование путей было бы слишком сложным.Итак, вам нужно будет позвонить CreateFile.На этом этапе просто запросите эксклюзивный доступ.

...