![]() |
Datei bereits in Benutzung
Hallo zusammen,
ich habe hier folgenden Source gefunden, um herauszufinden, dass eine Datei bereits in Benutzung ist (bereits lesend geöffnet).
Delphi-Quellcode:
Mein Problem ist, dass ich von einem PC (X) auf eine Datei die auf dem PC (Y) liegt zugreife mit einem MemoryStream.LoadfromFile(Dateiname).
function IsFileUsed(const FileName:String): Boolean;
const AccessMode: array[0..2] of LongWord = ( GENERIC_READ, GENERIC_WRITE, GENERIC_READ or GENERIC_WRITE); ShareMode: array[0..4] of LongWord = ( 0, 0, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE); var Mode : LongWord; iRes : INTEGER; begin Mode := fmOpenRead or fmShareDenyWrite; iRes := -1; if ((Mode and 3) <= fmOpenReadWrite) and (((Mode and $F0) shr 4) <= fmShareDenyNone) then iRes := Integer(CreateFile(PChar(FileName), AccessMode[Mode and 3], ShareMode[(Mode and $F0) shr 4], nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)); If iRes < 0 then Result := True else Result := False; If Not Result then CloseHandle(THandle(iRes)); end; Ich habe LoadFromFile überschrieben und beim öffnen der Datei ein fmShareExclusive angegeben, damit kein anderer mehr darauf schreiben oder lesen kann. Wenn ich jetzt aber vom PC (X) auch diese Datei öffnen will (fmOpenRead als Stream), dann dauert es ca. 40sek, bis das TFileStream.Create eine Exception auslöst und mir mitteilt, dass der Versuch die Datei zu öffnen schief ging. Auch die erwähnte Funktion oben, liefert mir nicht sofort (ca. 40sek) später, dass die Datei in Benutzung ist. Die Datei ist relativ groß und der Zugriff von PC (Y) dauert auch wesentlich länger als 40sek. Habt ihr noch Ratschläge, wie ich herausbekomme, dass die Datei in Benutzung ist mit einer "Spontanantwort"? Viele Grüße Alex |
Re: Datei bereits in Benutzung
Worüber greifst du denn auf die Datei zu?
das Problem hierbei ist, daß du nicht direkt auf die Datei zugreifst, sondern über irgendein Freigabesystem und wie das auf der anderen Seite die Datei öffnet, kann man nicht immer und überall bestimmen. |
Re: Datei bereits in Benutzung
PC (X) greift so auf die Datei zu:
Delphi-Quellcode:
Dieser Source ist in einer überladenen Funktion von MemoryStream.LoadFromFile.
Stream := TFileStream.Create(DateiName, fmOpenRead or fmShareExclusive);
Die "normale" LoadFromFile vom Memorystream macht ja nix anderes außer anstatt fmShareExclsuive -> fmShareDenyNone zu nutzen. Der PC (Y), wo die Datei liegt greift so auf die Datei zu:
Delphi-Quellcode:
Und da liegt das Problem.
TmpStream := TFileStream.Create (DateiName, fmOpenReadWrite or fmShareDenyNone);
Wenn PC (Y) auf die Datei zugreifen will aber diese noch durch fmShareExclusive von PC (X) blockiert ist, dann kommt die Exception beim TFileStream.Create erst ca. 40sek nach Aufruf von .Create Viele Grüße Alex |
Re: Datei bereits in Benutzung
neee, ich meinte wie das mit der Freigabe der Dateien aussieht ... es gibt ja verschiedene Varianten, wie Dateien eines anderen Rechneres in dem PC zur Verfügung gestellt werden
|
Re: Datei bereits in Benutzung
PC (X) hat eine Netzlaufwerksverknüpfung auf PC (Y) sein Verzeichnis, wo die Daten liegen.
Die Netzlaufwerksberechtigung liegt bei Vollberechtigung. Viele Grüße Alex |
Re: Datei bereits in Benutzung
Hast du ein gemapptes Laufwerk (H:\) oder ne UNC-Notation(\\PCX\)
Versuch beides mal. Was passiert wenn du über den Explorer auf die Datei zugreifst? |
Re: Datei bereits in Benutzung
gemapptes Netzlaufwerk...
Explorer meldet sofort, dass die Datei bereits benutzt wird |
Re: Datei bereits in Benutzung
Gibts vllt ein extrem langes ReadTimeout?
|
Re: Datei bereits in Benutzung
Leider weiß ich nicht, ob es so eine Art TimeOut gibt.
Wenn ja, wäre dass die Lösung aber vielleicht kann das ja jemand hier bestätigen bzw. verwerfen. Viele Grüße Alex |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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