Jednoczesne pisanie i czytanie pliku z różnych programów.

0

W C++ piszę coś takiego:

ofstream file(FileName,ios::binary);
while(!Terminated)
  {
   ...
   file.write(&Data,sizeof(Data));
  }

Podczas kiedy program wciąż pisze do pliku to mogę innym programem otworzyć ten sam plik tylko do odczytu i to mi się podoba.

W Delphi próbuje bezskutecznie osiągnąć ten sam efekt:

File:=TFileStream.Create(FileName,fmCreate or fmShareDenyWrite);
while not Terminated do
begin
  ...
  File.Write(Data,SizeOf(Data));
end;

W innym programie NIE mogę otworzyć pliku tylko do odczytu. Bez fmShareDenyWrite ten sam efekt.

Jak mam w Delphi otworzyć plik aby pozwolić innym programom na odczyt tego pliku?

0

I na pewno googla pytałeś: http://stackoverflow.com/questions/5652922/how-to-read-a-file-that-is-in-use-by-other-process

fmShareDenyWrite

Jakbyś to przetłumaczył to by wyszło: Udostępnianie zabroń pisanie.

0
-123oho napisał(a):

I na pewno googla pytałeś: http://stackoverflow.com/questions/5652922/how-to-read-a-file-that-is-in-use-by-other-process

fmShareDenyWrite

Jakbyś to przetłumaczył to by wyszło: Udostępnianie zabroń pisanie.

A gdybyś zajrzałeś do dokumentacji:mShareDenyWrite - Other applications can open the file for reading but not for writing.

Albo gdybyś przeczytałeś ten udostępniony przez ciebie link kawałek dalej:FFileStream := TFileStream.Create(FFilename, fmOpenWrite or fmShareDenyWrite);

fmShareDenyNone - odpada bo pozwala również na pisanie (w teorii, nie sprawdzałem).

0

Zakłdam że C++ daje domyślnie fmShareDenyNone i dlatego twój jakiśtam program którym to czytasz który otwiera to w trybie zapis+odczyt daje radę.
Delphi pewnie zakłada że jeżeli piszesz do pliku to można z niego czytać (fmShareDenyWrite domyślnie przy zapisie) a twój jakiśtam program chce zapis+odczyt = fail. Zresztą Delphi zakłada tak jak tobie się wydaje że powinno być (odpada bo pozwala również na pisanie), a C++ zezwala wbrew twoim przekonaniom.
Straszne masz problemy, które zapewne wynikają z niemyślenia.

Sprawdź z fmShareDenyNone i zobacz że działa... A potem stwierdź że C++ zrobiło to czego ty nie chciałeś i dzięki temu działało i nie wiedziałeś o co chodzi (=błędogenne)

0
-123oho napisał(a):

Zakłdam że C++ daje domyślnie fmShareDenyNone i dlatego twój jakiśtam program którym to czytasz który otwiera to w trybie zapis+odczyt daje radę.
Delphi pewnie zakłada że jeżeli piszesz do pliku to można z niego czytać (fmShareDenyWrite domyślnie przy zapisie) a twój jakiśtam program chce zapis+odczyt = fail. Zresztą Delphi zakłada tak jak tobie się wydaje że powinno być (odpada bo pozwala również na pisanie), a C++ zezwala wbrew twoim przekonaniom.
Straszne masz problemy, które zapewne wynikają z niemyślenia.

Sprawdź z fmShareDenyNone i zobacz że działa... A potem stwierdź że C++ zrobiło to czego ty nie chciałeś i dzięki temu działało i nie wiedziałeś o co chodzi (=błędogenne)
Nie jestem początkującym leniem który nie sprawdzi googla nie zrobi eksperymentu a chcę gotowego rozwiązania. Dobrze wiem że podany przykład w C++ pozwala również na pisanie, ale mnie to nie obchodzi ponieważ muszę napisać w Delphi z pozwoleniem na odczyt i bez pozwolenia na zapis. Właśnie twoje założenia są błędogenne, zresztą sprawdzałem z fmShareDenyNone ale również nie działa, nie wierzysz sprawdź sam:

program ShareRead;
{$APPTYPE CONSOLE}
uses
  SysUtils,Classes;

procedure Run;
var Fs:TFileStream;
const S:String='Ala ma kota'#13#10;
begin
  Fs:=TFileStream.Create('test.bin',fmCreate or fmShareDenyNone);
  Fs.Write(S[1],Length(S));
  Write('1. Writed: ');
  ReadLn;
  Fs.Write(S[1],Length(S));
  Write('2. Writed: ');
  ReadLn;
  Fs.Free;
end;

begin
  Run;
end.
1

Właśnie twoje założenia są błędogenne, zresztą sprawdzałem z fmShareDenyNone ale również nie działa, nie wierzysz sprawdź sam:

Notepad++ otwiera bez najmniejszego problemu. z fmShareDenyWrite też. Sprwadzane w Lazarusie.
z fmShareDenyWrite nie pozwala na zapis, z None pozwala. Wszystko działa tak jak powinno.

ale mnie to nie obchodzi ponieważ muszę napisać w Delphi z pozwoleniem na odczyt i bez pozwolenia na zapis.

No to używasz fmShareDenyWrite. I będzie działać. Sprawdzane pod Lazarusem 0.9.30.4 (FPC 2.6.0).
I jeszcze narzekasz że w C++ (który pozwala na zapis) działa, a w Delphi które nie zezwala nie działa, a potem stwierdzasz że nie obchodzi ciebie że w C++ działa ale to jest wymóg.

Nie jestem początkującym leniem który nie sprawdzi googla nie zrobi eksperymentu a chcę gotowego rozwiązania.

Wcale ciebie o to nie oskarżam.

0

Rzeczywiście pod Lazarusem działa jak należy zaś pod Delphi - nie. :/

Tak też zadziałało:

  TFileStream.Create('test.bin',fmCreate).Free;
  Fs:=TFileStream.Create('test.bin',fmOpenWrite or fmShareDenyNone);

Dziwna sprawa.

W Lazarusie fmCreate to $FF00 w Delphi $FFFF.
Otwieranie w Delphi z $FF00 - nie tworzy pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1