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
Benutzerbild von himitsu
himitsu

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

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 16:43
Zitat von OH: fmshareexclusive:
Legt eine gemeinsame Dateinutzung fest, die jeglichen Dateizugriff durch andere Anwendungen verhindert.


Zitat:
xml.LoadFromFile('C:\Temp\Test.xml');
Das Problem liegt wohl darin, dass ich mit LoadfromFile das XML nochmal versuche zu öffnen...
Nicht nur vermutlich, sondern bestimmt.

Die Datei nicht exklusiv öffnen, den String auslesen
und dann den XML-"String" an die XML-Komponente übergeben.

Genauso kann man den XML-String erst aus der Komponente rausholen und dann selber in die Datei schreiben.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
kkoe

Registriert seit: 6. Mai 2014
3 Beiträge
 
#2

AW: Simultaner Zugriff auf Datei

  Alt 2. Jun 2014, 17:02
Zitat:
Die Datei nicht exklusiv öffnen, den String auslesen
und dann den XML-"String" an die XML-Komponente übergeben.
Jetzt komm ich nicht mit, welcher ist der String und welcher der XML-"String"(=Filename??)?
Und durch das Weglassen der Exklusivrechte können doch wieder andere Programme auf die Datei zugreifen, während dieses Programm am bearbeiten ist, oder? (Das wollte ich ja verhindern)
  Mit Zitat antworten Zitat
Der schöne Günther

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

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
 
#4

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.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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
 
#6

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
 
#7

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
439 Beiträge
 
#8

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
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: Simultaner Zugriff auf Datei

  Alt 3. Jun 2014, 08:08
Aha, dieser Nebensatz scheint entscheidend zu sein.
Und durch das Weglassen der Exklusivrechte können doch wieder andere Programme auf die Datei zugreifen, während dieses Programm am bearbeiten ist, oder? (Das wollte ich ja verhindern)
Der TE will vermutlich durch das exklusive öffnen der Datei den Transaktions-Mechanismus realisieren? Aus den anderen Nebenbemerkungen schließe ich, das die Datei in relativ kurzen Zeitabständen aktualisiert wird (da ist von ms die Rede). In einem solchen Fall würde ich denken, dass das besser über einen Masterprozess realisiert wird, der dann die Daten nach außen via Interprozesskommunikation zu Verfügung stellt.
  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 18:06 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