Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datei exklusiv öffnen (https://www.delphipraxis.net/61307-datei-exklusiv-oeffnen.html)

Avax2k 19. Jan 2006 18:13


Datei exklusiv öffnen
 
Hi hab folgenden Code

Delphi-Quellcode:
const FILE_NAME = 'C:\Test.txt';
procedure TForm1.Button1Click(Sender: TObject);
begin
TFileStream.Create(File_Name, fmshareexclusive);
Shellexecute(0,'OPEN',Pchar(File_Name),nil,0,0);
end;
so ich bekomme nun die meldung, dass ich die Datei nicht öffnen kann weil sie geschützt ist..das wollte ich auch erreichen..aber erst wollte ich sie gern offen haben und erst dann schützen..wie stelle ich das denn an..oder geht das nicht mehr ?

Danke schonmal für die Hilfe

messie 19. Jan 2006 18:26

Re: Datei exklusiv öffnen
 
Du hast mit Deinem Code zwei unabhängige Zugriffe gebaut: zuerst den exclusiven Zugriff per Filestream (damit gehört die Datei exclusiv Deinem TFilestream) und dann einen Zugriff auf Betriebssystemebene (der wird dann natürlich geblockt).
Gib' zuerst Deinem Filestream einen Namen:
Delphi-Quellcode:
Fs := TFilestream.create(...)
FS.Read(var Buffer; Count: Longint): Longint;//das schaust Du in der Hilfe nach
Erst wenn Du den FileStream freigibts, kann wieder anderweitig auf die Datei zugegriffen werden.

Grüße, Messie

marabu 19. Jan 2006 18:27

Re: Datei exklusiv öffnen
 
Hi,

und außerdem musst du etwas mehr auf die Syntax achten:

Delphi-Quellcode:
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(FileName, fmOpenRead, fmShareExclusive);
  // ...
  fs.Free;
end;
Grüße vom marabu

Avax2k 19. Jan 2006 18:33

Re: Datei exklusiv öffnen
 
okay das habe ich gemeint, wenn ich den Stream wieder freigebe dann kann man wieder beliebig auf die Datei zugreifen..das ist aber gar nicht gut :(.

marabu 19. Jan 2006 19:08

Re: Datei exklusiv öffnen
 
Das musst du wohl etwas genauer erklären. Du willst den share mode für eine geöffnete Datei nachträglich ändern und die Zugriffsperre soll erhalten bleiben, auch wenn dein Programm seinen Zugriff beendet? Das erste erreichst du über ReopenFile(), das zweite ist etwas schwieriger. Aber vielleicht habe ich dich ja auch völlig falsch verstanden.

marabu

Avax2k 19. Jan 2006 19:12

Re: Datei exklusiv öffnen
 
ich möchte, dass solange mein Programm läuft und eine Datei benutzt diese eben gesperrt ist, wenn mein Programm beendet wird soll der Zugriff aufgehoben werden.
Somit wäre es, wie du sagst die Variante mit ReOpenFile()

marabu 19. Jan 2006 19:17

Re: Datei exklusiv öffnen
 
Nein, dann ist mein erster Code der richtige. Allerdings musst du den Zeitpunkt für das Create und das Free des FileStream geschickt legen - vielleicht Create in den event handler für OnCreate deiner MainForm und das Free in den event handler für OnDestroy.

marabu

Avax2k 19. Jan 2006 19:22

Re: Datei exklusiv öffnen
 
ja nur wenn ich eben die Datei als Stream habe dann kann ich sie nicht öffnen und wenn ich free mache dann kann ich sie öffnen nur ist sie nicht mehr geschützt.

OnCreate mache ich sie geschützt..aber kann mit ihr dann gar nichts anfangen würde sie gern mit shellexcute ausführen..aber geht ja nicht..und bei free geht es klar aber dann ist sie nicht mehr geschützt die Datei :(

will somit eine Datei erst Öffnen und dann nachträglich den Zugriff sperren, sprich so lange mein Programm die Datei benutzt soll der Zugriff nicht mehr funktionieren.

marabu 19. Jan 2006 19:47

Re: Datei exklusiv öffnen
 
Deine Anforderung wird vielleicht besser über Berechtigungen (Benutzerrechte) abgedeckt. Vielleicht gibt es noch eine andere Lösung. Um was für einen Dateityp handelt es sich denn? Und warum das Ganze?

marabu

messie 19. Jan 2006 19:51

Re: Datei exklusiv öffnen
 
Habe ich das richtig verstanden:

Du möchtest die Datei von Beginn bis Ende Deiner Programmlaufzeit für andere Prozesse sperren, sie aber während Deiner Programmausführung per Shellexecute starten können?

Dann kannst Du direkt vor Shellexecute freeandnil(FS) benutzen, und danach wieder FS.create(...). Damit bleibt für andere Prozesse nur ein Zeitfenster von einigen hundert Prozessorschritten um sich die Datei zu greifen.
Such mal in der Hilfe nach oder suche nach Beispielen, wie Shellexecute auf die Ausführung der Datei wartet damit Du keine Zugriffsverletzung beim erneuten create bekommst. Evtl. noch ein application.processmessages dazwischenschalten, wenn Du nicht in einem Thread arbeitest.

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Seite 1 von 4  1 23     Letzte »    

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