Hallo zusammen,
ich habe hier folgenden Source gefunden, um herauszufinden, dass eine Datei bereits in Benutzung ist (bereits lesend geöffnet).
Delphi-Quellcode:
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;
Mein Problem ist, dass ich von einem PC (X) auf eine Datei die auf dem PC (Y) liegt zugreife mit einem MemoryStream.LoadfromFile(Dateiname).
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