![]() |
nicht exklusiver Zugriff mit CreateFile erwünscht
Hallo,
ich habe vor kurzem die Funktion "CreateFile" und das Flag "FILE_FLAG_DELETE_ON_CLOSE" entdeckt. Wenn ich das richtig verstanden habe erzeugt mir CreateFile eine Datei die dann automatisch gelöscht wird wenn ich das erhaltene Handle schließe oder die Anwendung geschlossen wird. Soweit so gut. Ich möchte jetzt also so ein Datei erstellen, füllen und dann an anderer Stelle in ein Blobfeld speichern. Beim speichern bekomme ich dann aber immer die Fehlermeldung das die Datei nicht geöffnet werden kann. So habe ich das gemacht:
Delphi-Quellcode:
Kann das überhaupt funktionieren? Falls ja was mache ich falsch? Gibt es bessere Alternativen?
//Filename enthält schon den gewünschten Pfad und Dateinamen
Hnd := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_DELETE or FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0); ... hHdlStream := THandleStream.Create(Hnd); hHdlStream.Write(oMemStream, oMemStream.Size); //oMemStream enthält die zu schreibenden Daten hHdlStream.Free; SendFile(FileName); //hier kommt der Fehler wenn ich "LoadFromFile" aufrufe CloseHandle(Hnd); |
Re: nicht exklusiver Zugriff mit CreateFile erwünscht
wenn ich das richtig sehe, erstellst du die datei dann in nem Stream.
lade die datei einfach mal aus dem stream heraus, bevor du Ihn wieder freigibst |
Re: nicht exklusiver Zugriff mit CreateFile erwünscht
LoadFromFile du könntest dir ja LoadFromFile überschreiben und Daß dort kein exclusiver Zugriff erfolgt.
Oder du verwendest in SendFile LoadFromStram und verwendest entweder gleich den vorhergehenden Strem, bzw. erstellst einen eigenen für's Senden. |
Re: nicht exklusiver Zugriff mit CreateFile erwünscht
Zitat:
Delphi-Quellcode:
oFileStream := TFileStream.Create(sTmpFile, fmOpenRead or fmShareDenyNone);
Zitat:
Wenn das nicht möglich ist dann kann ich diese automatisch-löschen-Funktionalität nicht verwenden. |
Re: nicht exklusiver Zugriff mit CreateFile erwünscht
Ich mein, offensichtlich hast Du ja schon mal in die
![]() Zitat:
|
Re: nicht exklusiver Zugriff mit CreateFile erwünscht
Zitat:
Nunja...damit bin ich in Stück weiter gekommen aber leider auch noch nicht am Ziel. Ich habe einfach als Basis einen THandleStream verwendet und dann ein eigenes Create (ab)geschrieben. Dabei habe ich bisher nur das öffnen einer bestehenden Datei geändert um zunächst testen zu können. Jetzt bekomme ich keine Fehlermeldung mehr aber der Inhalt ist einfach Schrott. (die Dateigröße bleibt gleich, der Inhalt sieht aber wie Speichermüll aus) Sieht jemand meinen Fehler? ich habe Tomaten auf den Augen.
Delphi-Quellcode:
constructor TMyFileStream.Create(const FileName: string; Mode: Word);
var hFile : integer; begin if Mode = fmCreate then begin hFile := FileCreate(FileName); if hFile < 0 then raise EFCreateError.CreateResFmt(@SFCreateError, [FileName]); end else begin hFile := integer(CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_DELETE or FILE_SHARE_WRITE or FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)); if hFile < 0 then raise EFOpenError.CreateResFmt(@SFOpenError, [FileName]); end; inherited Create(hFile); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 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