Ага, в RTL от FPC на открытие текстовых файлов в Windows переменная FileMode всё таки влияет.
Смотрим в rtl/win/sysfile.inc:
- Код: Выделить всё
procedure do_open(var f; p: pchar; flags: longint);
{
filerec and textrec have both handle and mode as the first items so
they could use the same routine for opening/creating.
when (flags and $100) the file will be append
when (flags and $1000) the file will be truncate/rewritten
when (flags and $10000) there is no check for close (needed for textfiles)
}
Const
file_Share_Read = $00000001;
file_Share_Write = $00000002;
file_Share_Delete = $00000004;
Var
shflags, oflags, cd: longint;
security: TSecurityAttributes;
begin
...
{ convert filesharing }
shflags:=0;
if ((filemode and fmshareExclusive) = fmshareExclusive) then
{ no sharing }
else
if (filemode = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
shflags := file_Share_Read
else
if ((filemode and fmshareDenyRead) = fmshareDenyRead) then
shflags := file_Share_Write
else
if ((filemode and fmshareDenyNone) = fmshareDenyNone) then
shflags :=
{$ifdef WINCE}
{ WinCE does not know file_share_delete }
file_Share_Read or file_Share_Write;
{$else WINCE}
fmShareDenyNoneFlags;
{$endif WINCE}
...
filerec(f).handle:=CreateFile(p,oflags,shflags,@security,cd,FILE_ATTRIBUTE_NORMAL,0);
...
end;
Если посмотреть на *nix-овую реализацию do_open() (rtl/unix/sysfile.inc), то там зависимости от переменной FileMode не увидим.
И для полноты картины режимы открытия и битовые маски разделения доступа:
- Код: Выделить всё
const
fmOpenRead = $0000;
fmOpenWrite = $0001;
fmOpenReadWrite = $0002;
fmShareCompat = $0000;
fmShareExclusive = $0010;
fmShareDenyWrite = $0020;
fmShareDenyRead = $0030;
fmShareDenyNone = $0040;
Варианты fmShareDeny* пришли из MS-DOS, подробнее:
http://blogs.msdn.com/b/larryosterman/a ... 31263.aspx (en) или перевод:
http://www.transl-gunsmoker.ru/2009/04/ ... write.html (ru). Ещё подробнее -- в руководстве по MS-DOS.
Добавлено спустя 12 минут 30 секунд:С учётом того, что атрибуты fmShareDeny* занимают старший полубайт, вот эта строчка:
- Код: Выделить всё
if (filemode = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
shflags := file_Share_Read
должна была бы выглядеть так:
- Код: Выделить всё
if ((filemode and $f0) = fmShareCompat) or ((filemode and fmshareDenyWrite) = fmshareDenyWrite) then
shflags := file_Share_Read
В этом случае при FileMode равном 2 файл будет открываться с разделением доступа на чтение (при этом собственно режим 2 -- fmOpenReadWrite в младшем полубайте при открытии текстового файла не используется, как и задумано).
А в существующем варианте нельзя задать fmShareCompat для открытия не в режиме чтения (не fmOpenRead).