Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#6

Re: Datei bereits verwendet?

  Alt 8. Dez 2006, 17:31
Zitat von Reinhard Kern:
Versuch doch, sie selbst exklusiv zu öffnen. Wenn das geht, hat sie sonst niemand offen.
Ich will ja nichts sagen, da es im meistens stimmt...



aber ...


Na ja, im Anhang sind 3 Programme:

Project3 erstellt 'ne Datei und hällt sie geöffnet - der Inhalt wird ausgelesen und angezeigt.

Project4 öffnet diese Datei mit exclusiven Rechten und schreibt was rein.
(könnt euch ja im QuellCode vergewissern)

Project5 öffnet die Datei mit Sharingrechten, ließt/schreibt den Inhalt und zeigt ihn an.


Das, was Project4 und Project5 machen, nochma im Kurzen...
Delphi-Quellcode:
// Project4
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE,
  0 {kein FILE_SHARE_READ und FILE_SHARE_WRITE}, nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE Then Raise Exception.Create('Can''t open the file.');

While ... do Begin
  i := Random(MaxInt);
  SetFilePointer(FH, 0, nil, FILE_BEGIN);
  WriteFile(FH, i, 4, W, nil);
  Edit1.Text := IntToStr(i);
End;

CloseHandle(FH);
Wie man sieht ... keine SharingRecht.
Delphi-Quellcode:
// Project5
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE,
  FILE_SHARE_READ und FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);
If FH = INVALID_HANDLE_VALUE Then Raise Exception.Create('Can''t open the file.');

While ... do Begin
  SetFilePointer(FH, 0, nil, FILE_BEGIN);
  ReadFile(FH, i, 4, W, nil);
  Edit1.Text := IntToStr(i);
End;

CloseHandle(FH);


Aber nun mal zum Grund:
[quote="MSDN - CreateFile"]dwShareMode
[in] Sharing mode of the object (reading, writing, both, or neither).
You cannot request a sharing mode that conflicts with the access mode specified in a previous open request whose handle is still open.
Dieses gilt also nur für "offene" FileHandles ... Project3 jedoch öffnet/erstellt die Datei zwar per
FH := CreateFile(PChar('Project3.dat'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0); aber schließt daß FileHandle danach wieder.

Demnach würde "... alle Handles per Treiber zusammenkratzt und überprüfst..." leider auch nicht funktionieren. :tonque:
Selbst über FileMon und den ProcessExplorer bekommen man nichts von einem FileHandle in Project3 mit. (OK, es gibt ja Keines mehr)



Also, für'n "Normalfall" sollte das Öffnen mit exclusiven Rechten vollkommend ausreichend sein
und der winzige Rest wird wohl ein bissl zu aufwendig werden. :engel:
Ich kenn jedenfalls noch keine andere wirkungsvolle Methode dieses "schnell/einfach" zu prüfen.


  • Project3 und danach Project4 starten = Datei läßt sich exclusiv öffnen
  • Project5 und danach Project4 starten = Datei läßt sich nicht exclusiv öffnen
  • Project4 und danach Project5 starten = Datei läßt sich nicht öffen, da bereits exclusiv geöffnen
  • Project5 mehrmals starten = Datei läßt sich öffnen
    Sollte ja auch Aufgrund der SharingRechte so sein.
  • Project5 und Project3 können natürlich beliebig oft gestartet werden.
    Kein Wunder, denn der Aufruf von CreateFile ist ganz genau gleich und mit SharingRechten
Angehängte Dateien
Dateityp: zip datei_bereits_verwendet_209.zip (566,2 KB, 38x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat