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

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

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

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Mr.Smart » 02.02.2011 12:39:22

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

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Maxizar » 02.02.2011 12:46:21

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

Информация вот от сюда
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Mr.Smart » 02.02.2011 12:58:43

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

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Maxizar » 02.02.2011 13:15:20

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. Вопрос мелкий, а сколько времени потрачено. Вот был конкретный вопрос (ситуация) получен короткий ответ. Уже можно оформить как минимум: Проблема-решение, Обсуждение на форуме, а конечный вариант (короткий и оформленный + описание) записать в базу. ИМХО.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Vadim » 03.02.2011 07:18:13

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

На форуме есть такая ветка уже, как раз типа "вопрос-ответ". Киньте туда. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Maxizar » 03.02.2011 11:18:07

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

PS. Если смогу, ознакомится с DocBook, в такой мере, что меня будет устраивать конечный сгенерированный документ скажем в CHM, то буду использовать ее для создания своей базы знаний, а то скопилось достаточно много документации, статей и прочего… Так что если дадите ссылочку на русскую документацию по сабжу буду рад.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение alexs » 03.02.2011 20:35:33

А почему не fb2?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение скалогрыз » 03.02.2011 20:43:10

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 );
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Mr.Smart » 04.02.2011 01:23:59

alexs просветите пожалуйста не въехавших, что означает "fb2"? :oops:
Всё понял :oops: Нужно было сразу у ZOG (Google) спросить...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение alexs » 04.02.2011 10:08:28

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

fb2 как то роднее :-) Наш формат для книг.
И простой до безобразия.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение Иван Шихалев » 04.02.2011 11:35:42

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

То-то и оно, что до безобразия :) Для технической литературы как-то не очень.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: TFileStream. Кроссплатформенно открыть файл

Сообщение MageSlayer » 02.05.2011 22:33:33

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

С этим патчем можно просто писать следующий код:
Код: Выделить всё
F:=TFileStream.Create( GlobalConfig.DebugLogFile, fmCreate or fmShareDenyWrite)
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru