TFileStream. Кроссплатформенно открыть файл [РЕШЕНО]
Модератор: Модераторы
Maxizar
fmShareDenyNone?
fmShareDenyNone?
fmCreate -создать новый файл. Если файл существует, то открывается в режиме чтения.
fmOpenRead - открыть для чтения.
fmOpenWrite - открыть для записи.
fmOpenReadWrite - открыть и для того, и для другого.
fmShareCompat - совмещенный режим доступа.
fmShareExclusive - эксклюзивный режим. Ни одно приложение не может читать или записывать открытый файл.
fmShareDenyWrite - запрет по записи для других приложений.
fmShareDenyRead - запрет по чтению.
fmShareDenyNone - никакого разделения ресурса.
Информация вот от сюда
fmOpenRead - открыть для чтения.
fmOpenWrite - открыть для записи.
fmOpenReadWrite - открыть и для того, и для другого.
fmShareCompat - совмещенный режим доступа.
fmShareExclusive - эксклюзивный режим. Ни одно приложение не может читать или записывать открытый файл.
fmShareDenyWrite - запрет по записи для других приложений.
fmShareDenyRead - запрет по чтению.
fmShareDenyNone - никакого разделения ресурса.
Информация вот от сюда
Совершенно другая информация http://delphi.scps.ru/file/file5504.htm
Добавлено спустя 3 минуты 52 секунды:
В Linux посмотреть реализацию не могу, но в Windows fmShareDenyNone соответствует FILE_SHARE_READ or FILE_SHARE_WRITE.
Добавлено спустя 9 минут 20 секунд:
Поковырявшись в исходниках, я бы советовал разграничения доступа писать в таком виде
это справедливо как для Windows так и для Linux.
Насчёт fmShareCompat для Linux. Судя по исходникам эта маска соответствует fmShareExclusive. Хотя для Windows это тоже справедливо:
linux:
Windows:
Добавлено спустя 3 минуты 52 секунды:
В Linux посмотреть реализацию не могу, но в Windows fmShareDenyNone соответствует FILE_SHARE_READ or FILE_SHARE_WRITE.
Добавлено спустя 9 минут 20 секунд:
Поковырявшись в исходниках, я бы советовал разграничения доступа писать в таком виде
Код: Выделить всё
f := TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);это справедливо как для Windows так и для Linux.
Насчёт fmShareCompat для Linux. Судя по исходникам эта маска соответствует fmShareExclusive. Хотя для Windows это тоже справедливо:
linux:
Код: Выделить всё
case (mode and (fmShareCompat or fmShareExclusive or fmShareDenyWrite or fmShareDenyRead or fmShareDenyNone)) of
fmShareCompat,
fmShareExclusive:
lockop:=LOCK_EX or LOCK_NB;
fmShareDenyWrite:
lockop:=LOCK_SH or LOCK_NB;
fmShareDenyNone:
exit;
else
begin
{ fmShareDenyRead does not exit under *nix, only shared access
(similar to fmShareDenyWrite) and exclusive access (same as
fmShareExclusive)
}
repeat
closeres:=FpClose(Handle);
until (closeres<>-1) or (fpgeterrno<>ESysEINTR);
DoFileLocking:=-1;
exit;
end;
end; Windows:
Код: Выделить всё
ShareMode: array[0..4] of Integer = (
0,
0,
FILE_SHARE_READ,
FILE_SHARE_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE);
Var
FN : string;
begin
FN:=FileName+#0;
result := CreateFile(@FN[1], dword(AccessMode[Mode and 3]),
dword(ShareMode[(Mode and $F0) shr 4]), nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0); Mr.Smart - Спасибо... Работает.
Вот зладеи, а я голову ломаю...
вот решение:
1 Вариант при помощи TFileStream
2 Вариант при помощи простого FileOpen
PS. Я же говорил, что нужна база знаний аля DRKB. Вопрос мелкий, а сколько времени потрачено. Вот был конкретный вопрос (ситуация) получен короткий ответ. Уже можно оформить как минимум: Проблема-решение, Обсуждение на форуме, а конечный вариант (короткий и оформленный + описание) записать в базу. ИМХО.
Вот зладеи, а я голову ломаю...
вот решение:
1 Вариант при помощи TFileStream
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
f : TFileStream;
begin
if OpenDialog1.Execute then
begin
Try
f := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone);
f.Seek(0, soFromBeginning);
//Работаем
finally
f.Free;
end;
end;
end;
2 Вариант при помощи простого FileOpen
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var F:THandle;
begin
if OpenDialog1.Execute then
Try
F :=FileOpen(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone);
FileSeek(F,0,1) ;
//Работаем
finally
FileClose(F);
end;
end;
PS. Я же говорил, что нужна база знаний аля DRKB. Вопрос мелкий, а сколько времени потрачено. Вот был конкретный вопрос (ситуация) получен короткий ответ. Уже можно оформить как минимум: Проблема-решение, Обсуждение на форуме, а конечный вариант (короткий и оформленный + описание) записать в базу. ИМХО.
Maxizar писал(а):Уже можно оформить как минимум: Проблема-решение,
На форуме есть такая ветка уже, как раз типа "вопрос-ответ". Киньте туда.
Если бы была база знаний, как предлагалось скажем на DocBook, то с пребольшим удовольствием., Не обязательно DocBook, может есть что то и получше… Но а переписывать из одного раздела форума в другой (и при этом стараться оформить хотя бы как вопрос-ответ), увольте не буду.
Сейчас, немного читаю и знакомлюсь с данной технологией, есть пару недовольств скажем как Fo процессор от апач, который требует Java машину, и т.п. Кстати может кто подскажет как перевести DocBook в PDF , без Java машины в Windows.
PS. Если смогу, ознакомится с DocBook, в такой мере, что меня будет устраивать конечный сгенерированный документ скажем в CHM, то буду использовать ее для создания своей базы знаний, а то скопилось достаточно много документации, статей и прочего… Так что если дадите ссылочку на русскую документацию по сабжу буду рад.
Сейчас, немного читаю и знакомлюсь с данной технологией, есть пару недовольств скажем как Fo процессор от апач, который требует Java машину, и т.п. Кстати может кто подскажет как перевести DocBook в PDF , без Java машины в Windows.
PS. Если смогу, ознакомится с DocBook, в такой мере, что меня будет устраивать конечный сгенерированный документ скажем в CHM, то буду использовать ее для создания своей базы знаний, а то скопилось достаточно много документации, статей и прочего… Так что если дадите ссылочку на русскую документацию по сабжу буду рад.
MageSlayer писал(а):Хай all
Бьюсь над задачкой:
Как _кроссплатформенно_ открыть файл лога на запись, а остальным процессам дать возможность читать его, пока он еще не закрыт.
Ну и естественно, файл лог должен сам создаваться, если еще не был создан и урезаться до нулевой длины при открытии на запись.
Хочется сделать без лишних хаков - и никак
Код: Выделить всё
if not FileExists(GlobalConfig.DebugLogFile) then begin
try
F:=TFileStream.Create( GlobalConfig.DebugLogFile, fmCreate); F.Free;
except
Exit; // не могу содать log-file
end;
end;
F:=TFileStream.Create( GlobalConfig.DebugLogFile, fmOpenReadWrite or fmShareDenyWrite );
alexs просветите пожалуйста не въехавших, что означает "fb2"? 
Всё понял
Нужно было сразу у ZOG (Google) спросить...
Всё понял
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
alexs писал(а):И простой до безобразия.
То-то и оно, что до безобразия
-
MageSlayer
- постоялец
- Сообщения: 216
- Зарегистрирован: 07.09.2006 12:30:44
Нормальное решение для Linux+Windows - http://bugs.freepascal.org/view.php?id=19280
С этим патчем можно просто писать следующий код:
С этим патчем можно просто писать следующий код:
Код: Выделить всё
F:=TFileStream.Create( GlobalConfig.DebugLogFile, fmCreate or fmShareDenyWrite)