TFileStream. Кроссплатформенно открыть файл [РЕШЕНО]

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Maxizar
fmShareDenyNone?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

fmCreate -создать новый файл. Если файл существует, то открывается в режиме чтения.
fmOpenRead - открыть для чтения.
fmOpenWrite - открыть для записи.
fmOpenReadWrite - открыть и для того, и для другого.
fmShareCompat - совмещенный режим доступа.
fmShareExclusive - эксклюзивный режим. Ни одно приложение не может читать или записывать открытый файл.
fmShareDenyWrite - запрет по записи для других приложений.
fmShareDenyRead - запрет по чтению.
fmShareDenyNone - никакого разделения ресурса.

Информация вот от сюда
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Совершенно другая информация http://delphi.scps.ru/file/file5504.htm

Добавлено спустя 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);   
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Mr.Smart - Спасибо... Работает.
Вот зладеи, а я голову ломаю...
вот решение:
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. Вопрос мелкий, а сколько времени потрачено. Вот был конкретный вопрос (ситуация) получен короткий ответ. Уже можно оформить как минимум: Проблема-решение, Обсуждение на форуме, а конечный вариант (короткий и оформленный + описание) записать в базу. ИМХО.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Maxizar писал(а):Уже можно оформить как минимум: Проблема-решение,

На форуме есть такая ветка уже, как раз типа "вопрос-ответ". Киньте туда. ;)
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Если бы была база знаний, как предлагалось скажем на DocBook, то с пребольшим удовольствием., Не обязательно DocBook, может есть что то и получше… Но а переписывать из одного раздела форума в другой (и при этом стараться оформить хотя бы как вопрос-ответ), увольте не буду.
Сейчас, немного читаю и знакомлюсь с данной технологией, есть пару недовольств скажем как Fo процессор от апач, который требует Java машину, и т.п. Кстати может кто подскажет как перевести DocBook в PDF , без Java машины в Windows.

PS. Если смогу, ознакомится с DocBook, в такой мере, что меня будет устраивать конечный сгенерированный документ скажем в CHM, то буду использовать ее для создания своей базы знаний, а то скопилось достаточно много документации, статей и прочего… Так что если дадите ссылочку на русскую документацию по сабжу буду рад.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А почему не fb2?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

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 );
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

alexs просветите пожалуйста не въехавших, что означает "fb2"? :oops:
Всё понял :oops: Нужно было сразу у ZOG (Google) спросить...
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Mr.Smart писал(а):alexs просветите пожалуйста не въехавших, что означает "fb2"

fb2 как то роднее :-) Наш формат для книг.
И простой до безобразия.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

alexs писал(а):И простой до безобразия.

То-то и оно, что до безобразия :) Для технической литературы как-то не очень.
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

Нормальное решение для Linux+Windows - http://bugs.freepascal.org/view.php?id=19280

С этим патчем можно просто писать следующий код:

Код: Выделить всё

F:=TFileStream.Create( GlobalConfig.DebugLogFile, fmCreate or fmShareDenyWrite)
Ответить