2011-01-13 5 views
1

Можно ли открыть один и тот же файл дважды (с CreateFileA), используя разные флаги (в этом случае один с FILE_FLAG_NO_BUFFERING и один без)?Открытие того же файла дважды с разными флагами?

В этом случае: Во время запуска я создаю временный файл (с FILE_FLAG_DELETE_ON_CLOSE). Я заполняю его последовательно, и я не хочу беспокоиться о том, чтобы делать небуферизованный ввод-вывод в этой части. Затем, пока процесс выполняется, я хочу получить доступ к этому файлу с использованием небуферизованного ввода-вывода, потому что у меня есть своя логика кэширования. Таким образом, я собираюсь снова открыть тот же файл, на этот раз с FILE_FLAG_NO_BUFFERING, а затем закрыть старый дескриптор. Я хочу сделать это в этом перекрытом образом по двум причинам:

  1. Параллельность. Если я закрою старый дескриптор, прежде чем открыть новый, кто-то еще может столкнуться с моим файлом.
  2. FILE_FLAG_DELETE_ON_CLOSE удалит мой файл, когда я закрою первый дескриптор без открытия другого. Это небольшое раздражение, которое я мог бы обойти.
+0

Случайный вопрос: Почему вы хотите использовать 'CreateFileA' вместо' CreateFileW'? – Joey

+1

Я сам не писал всю систему, только эту часть. Они дают мне имя файла как char *, поэтому я использую его как char * :-) Кроме того, я мог бы написать весь разговор о том, почему WCHAR глуп, кроме того, конечно, что его использование настолько обильно в Windows API что вы как-то должны его использовать. –

+0

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

ответ

1

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

0

Разве это не смешно?

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

Если вы не можете гарантировать эксклюзивный доступ к файлам, как вы можете помешать кому-то что-то сделать? Но если вы откроете исключительно, как вы можете снова открыть файл?

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

+3

Хотя верно, что ему нужно будет указать общую запись при первом открытии файла, он мог бы заблокировать его с помощью LockFile(), но так как он использует FILE_FLAG_DELETE_ON_CLOSE, я предполагаю, что это временный файл, и никакое другое приложение не будет с ним связываться, вероятно, – Anders

+0

@Anders LockFile .. о .. Я не знал такого API существовать. Благодарим вас за разъяснительный комментарий. – 9dan

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