AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi nicht exklusiver Zugriff mit CreateFile erwünscht
Thema durchsuchen
Ansicht
Themen-Optionen

nicht exklusiver Zugriff mit CreateFile erwünscht

Ein Thema von VizeTE · begonnen am 25. Jun 2009 · letzter Beitrag vom 29. Jun 2009
Antwort Antwort
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#1

nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 25. Jun 2009, 19:14
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:
        //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);
Kann das überhaupt funktionieren? Falls ja was mache ich falsch? Gibt es bessere Alternativen?
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 25. Jun 2009, 19:49
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 25. Jun 2009, 20:09
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.
$2B or not $2B
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 26. Jun 2009, 10:53
Zitat von himitsu:
LoadFromFile du könntest dir ja LoadFromFile überschreiben und Daß dort kein exclusiver Zugriff erfolgt.
Ich habe folgendes getestet, leider ohne Verbesserung:oFileStream := TFileStream.Create(sTmpFile, fmOpenRead or fmShareDenyNone);
Zitat von himitsu:
Oder du verwendest in SendFile LoadFromStram und verwendest entweder gleich den vorhergehenden Strem, bzw. erstellst einen eigenen für's Senden.
Ja, mit einem weiteren THandleStream gehts. Es ist für mich aber sehr umständlich wenn ich die sendende Funktion umstellen muß. Ich hatte gehofft das ich die Datei auch mit einem TFileStream öffnen kann, selbst wenn ich an andere Stelle das Handle noch habe. Schließlich habe ich doch alle möglichen FILE_SHARE_... angegeben.
Wenn das nicht möglich ist dann kann ich diese automatisch-löschen-Funktionalität nicht verwenden.
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#5

Re: nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 26. Jun 2009, 11:34
Ich mein, offensichtlich hast Du ja schon mal in die Doku geguckt, sonst wüsstest Du von dem Flag ja nichts. Der zweite Schritt wäre jetzt, nicht nach dem ersten Satz neben dem Flag aufhören zu lesen, dort steht nämlich:

Zitat:
The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.
If there are existing open handles to a file, the call fails unless they were all opened with the FILE_SHARE_DELETE share mode.
Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.
Bedeutet: Dein Filestream muss die Datei ebenfalls mit FILE_SHARE_DELETE öffnen, ansonsten wird der Zugriff verweigert. Dazu müsstest Du Dir imho allerdings eine eigene TFileStream Klasse ableiten. Ansonsten versteh ich nicht, wieso Du nicht einfach ein HandleStream verwendest. Du kannst ja durchaus weiterhin eine überladene SendFile Funktion anbieten, die einen Dateinamen akzeptiert, mit CreateFile ein Handle erzeugt und dann die SendFile Variante mit Handle aufruft.
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat
VizeTE

Registriert seit: 31. Dez 2002
178 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: nicht exklusiver Zugriff mit CreateFile erwünscht

  Alt 29. Jun 2009, 10:24
Zitat von Fridolin Walther:
Dein Filestream muss die Datei ebenfalls mit FILE_SHARE_DELETE öffnen
Das ist ein guter Tipp. Ich hatte mich auf die Doku von Delphi beschränkt, aber auch da hätte man das rauslesen können.
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;
  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 11:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz