вторник, 7 апреля 2009 г.

Как биты FILE_SHARE_* взаимодействуют с запрашиваемыми битами доступа?

Это перевод How do the FILE_SHARE_* bits interact with the desired access bits? Автор: Реймонд Чен.

На самом деле, это не так сложно. Если вы вставляете, скажем, FILE_SHARE_READ, то вы говорите: "Я не возражаю, если другие люди будут читать этот файл, пока я его держу открытым". И если вы не устанавливаете этот флаг, тогда вы говорите: "Я не хочу, чтобы другие люди читали данный файл, пока я держу его открытым".

Теперь все, что осталось сделать - это понять, что это означает.

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

Вот и все.

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

Конечно же, эти ограничения носят накопительный характер. Если один человек открывает файл без FILE_SHARE_READ, а другой человек открывает файл без FILE_SHARE_WRITE, то первая же попытка открыть файл либо для чтения, либо для записи будет неудачной (запрос чтения терпит неудачу, потому что первый человек не позволяет читать, а запрос записи терпит неудачу, потому что второй человек не позволяет писать).

Повторите вышеуказанную логику для разрешений на "delete" и "write" - и, в двух словах, это всё.

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

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

Заметьте, что задаваемые вами биты маски общего доступа не обязаны совпадать с битами запрашиваемого доступа к файлу. Биты маски общего доступа (file share bits) указывают на то, что вы хотите позволить делать другим людям. Биты маски запроса доступа (access bits) указывают, что вы хотите сделать сами.

Читать далее.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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