AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Simultaner Zugriff auf Datei

Ein Thema von kkoe · begonnen am 30. Mai 2014 · letzter Beitrag vom 3. Jun 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 17:46
Entweder habe ich gravierende Wissenslücken oder, soweit wir hier fest bei Windows sind, macht keiner eine Datei zum Lesen auf wenn da grade reingeschrieben wird. Nicht einmal der gleiche Prozess.
Willst du die Datei ein weiteres mal (zum Lesen) aufmachen muss der Schreibende entweder ein Mapping für die Datei angelegt haben (siehe MSDN: Sharing Files and Memory) oder der lesende ist ein Kindprozess des Schreibenden und kann das Filehandle erben.

Ansonsten, kein Weg. Das hätte ich jetzt spontan behauptet. Wenn das nicht stimmt freue ich mich
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 18:03
Ich hab' mal ne Zeitlang das verwendet, dann aber wieder verworfen. Weiß aber nicht mehr warum?
Delphi-Quellcode:
function FileInUse(const FileName: string): boolean;
var
  Success: Cardinal;
begin
  Result := false;
  if FileExists(FileName) then
  begin
    Success := CreateFile(PChar(FileName),
      GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Result := Success = INVALID_HANDLE_VALUE;
    if not Result then
      CloseHandle(Success);
  end;
end;

procedure Wait50;
var
  ATime: Cardinal;
begin
  ATime := GetTickCount;
  repeat
  until GetTickCount - ATime > 50;
  Application.ProcessMessages;
end;

function CanOpenFile(const FileName: string): boolean;
var
  TryCount: integer;
begin
  Result := true;
  if FileInUse(FileName) then
  begin
    TryCount := 0;
    repeat
      Wait50;
      Inc(TryCount);
      Result := not FileInUse(FileName);
    until Result or (TryCount = 20);
  end;
  if not Result then
    MessageDlg('Zugriff auf ' + FileName + ' verweigert.', mtError, [mbOK], 0);
end;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 18:08
Das versucht ja nur, mittels CreateFile die Datei zum Lesen aufzumachen und sagt, ob dabei INVALID_HANDLE_VALUE herauskam oder nicht. Auf so eine Lösung wird es denke ich ja auch hinauslaufen-

Nur würde ich hierbei bemängeln dass die Wahrscheinlichkeit zwar wahrscheinlich hoch, aber nicht garantiert ist dass du deine öffnen kannst nachdem das Prüfen einmal meinte, man könne sie zum Lesen öffnen: Zwischen Prüfen und Aufmachen kann sie sich ja schon wieder jemand anders geschnappt haben- Die Gegenseite könnte beispielsweise wieder anfangen zu schreiben.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 18:24
Kann sein. Prüfte glaub ich GENERIC_READ or GENERIC_WRITE usw. Weiß nicht mehr so genau?
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#5

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 18:56
Eventuell kannst Du die Datei auch kopieren und nach dem Lesen löscht du die Datei wieder.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#6

AW: Simultaner Zugriff auf Datei

  Alt 3. Jun 2014, 07:16
Irgendwie verstehe ich die Diskussion nicht. Selbstverständlich kann man eine Datei zum Lesen öffnen, auch wenn sie gerade geschrieben wird. Es können sogar mehrere Prozesse die Datei zum Schreiben öffnen. Dazu muss man TFilestreams mit den korrekten Parametern erzeugen und schon geht das wunderbar.
Zusätzlich sollte man sich einen Transaktions-Mechanismus ausdenken, der sicher stellt, dass die Daten konsistent sind. Aber das war ja hier nicht gefragt. Natürlich darf die Datei von keinem Prozess mit Exklusiv-Rechten geöffnet sein.

Anbei habe ich eine kleine Demo erzeugt. Dieses Programm kann mehrmals gestartet werden und alle können fröhlich auf der Datei schreiben und lesen.
Hinweis: Bei Delphis älter als Delphi 2010 (vielleicht auch 2009?) hat fmCreate noch keinen Share-Parameter erlaubt. Deshalb gibt es im Demo einen etwas wirren Workaround dafür. D.h. Wenn die Datei noch nicht existiert wird die Datei erzeugt und danach nochmal geschlossen. Ab Delphi 2010 kann man sich das sparen.
Angehängte Dateien
Dateityp: zip Demo.zip (223,1 KB, 27x aufgerufen)

Geändert von samso ( 3. Jun 2014 um 19:09 Uhr) Grund: typo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Simultaner Zugriff auf Datei

  Alt 3. Jun 2014, 07:32
Wenn ich eine Datei lesen will, die von einem anderen Prozess blockiert wird, kopiere ich mir die Datei und öffne die Kopie. Das klappt fast immer (außer bei SQL-Server).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Simultaner Zugriff auf Datei

  Alt 3. Jun 2014, 08:12
Wenn ich eine Datei lesen will, die von einem anderen Prozess blockiert wird, kopiere ich mir die Datei und öffne die Kopie.
Wenn du die Datei kopieren kannst, dan gibt das andere Program dir das echt die Datei zu lesen und dann kann man die Datei auch direkt öffnen.

Wenn des andere Programm keine Leserchte gewährt, dann kann man die Datei weder lesen noch kopieren.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Simultaner Zugriff auf Datei

  Alt 3. Jun 2014, 08:00
Selbstverständlich kann man eine Datei zum Lesen öffnen, auch wenn sie gerade geschrieben wird. Es können sogar mehrere Prozesse die Datei zum Schreiben öffnen. [...] Natürlich darf die Datei von keinem Prozess mit Exklusiv-Rechten geöffnet sein. Anbei habe ich eine kleine Demo erzeugt.
Du hast vollkommen recht, keine Ahnung warum ich gestern so einen Humbug erzählt habe

Die Dokumentation zu TFileStream.Create(..) fand ich (vor allem in der deutschen Fassung) auch nicht grade einfach verständlich. Aber wahrscheinlich sind's die Viren in meinem Kopf


Gutes Beispiel.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz