Delphi-PRAXiS

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

Avax2k 19. Jan 2006 20:03

Re: Datei exklusiv öffnen
 
klappt leider auch nicht
Delphi-Quellcode:
FreeAndNil(fs);
ShellExecute(0, 'OPEN', PChar(FILE_NAME),nil,nil,0);
fs:=TFileStream.Create(FILE_NAME, fmOpenRead);
geht leider auch nicht :(

messie 19. Jan 2006 20:28

Re: Datei exklusiv öffnen
 
Schreib' mal, was genau nicht klappt..

Grüße, Messie

Avax2k 19. Jan 2006 20:30

Re: Datei exklusiv öffnen
 
da kommt eben die meldung, dass die datei durch einen anderen prozess genutzt wird und nicht geöffnet werden kann


wenn ich

fs.create()

weglasse geht es das ist aber klar

SirThornberry 19. Jan 2006 20:45

Re: Datei exklusiv öffnen
 
das was du vor hast geht einfach nicht. Denn sobald die Datei gestartet ist, ist sie in Verwendung und somit kannst du nicht mehr die Datei sperren weil Sie von einem anderen Process teilweise gesperrt ist.

Avax2k 19. Jan 2006 20:53

Re: Datei exklusiv öffnen
 
das habe ich befürchtet...kann ich denn überhaupt die Datei sperren, wenn sie von einem bestimmten Programm geöffnet wird..sie zum Beispiel wordpad..solange eben wordpad auf die Datei zugreift kann man nicht separat zugreifen.
Das würde mir auch sehr weiterhelfen.

messie 19. Jan 2006 20:57

Re: Datei exklusiv öffnen
 
Zitat:

Zitat von Avax2k
da kommt eben die meldung, dass die datei durch einen anderen prozess genutzt wird und nicht geöffnet werden kann

wenn ich

fs.create()

weglasse geht es das ist aber klar

Bau' mal Deinen Aufruf so um:
Delphi-Quellcode:
fs := TFilestream.create(...); //bei FormCreate
//in Deiner Routine wo Du die externe Datei aufrufst:
freeandnil(fs);
application.processmessages;//das können auch viel mehr als ein paar hundert Prozessorschritte sein...
if ShellExecute(Application.Handle,'Open',PChar(filename),nil,nil,SW_ShowNormal)> 0 then
begin
  //Shellexecute wartet auf die Beendigung des Aufrufs und gibt das Handle der aufgerufenen Datei zurück...
  //...habe ich wenig Erfahrung mit, schau Dir mal Beispiele an
end;
application.processmessages;
fs := TFilestream.create(...);

Avax2k 19. Jan 2006 21:15

Re: Datei exklusiv öffnen
 
das geht auch nicht..ist auch logisch, denn egal was als Ergebnis ist, sobald das Programm versucht die Datei zu starten ist der Prozess auf Öffnen und zeitgleich wird der Zugriff gesperrt..ist wohl wie dein Vorredner sagte..unmöglich umzusetzen :(


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
freeandnil(fs);
ShellExecute(Application.Handle, 'OPEN', PChar(FILE_NAME),nil,nil,fmShareExclusive);
//Application.Run;
fs:=TFileStream.Create(FILE_NAME, fmShareExclusive);
komischerweise geht das ganze, wenn ich Application.Run mache...jedoch werden die Rechte dann nicht wie es sollte zugrückgesetzt und die Datei ist frei kopierbar.

messie 19. Jan 2006 21:34

Re: Datei exklusiv öffnen
 
Zitat:

Zitat von Avax2k
das geht auch nicht..ist auch logisch, denn egal was als Ergebnis ist, sobald das Programm versucht die Datei zu starten ist der Prozess auf Öffnen und zeitgleich wird der Zugriff gesperrt..ist wohl wie dein Vorredner sagte..unmöglich umzusetzen :(

Nö, muß meiner Meinung nach nicht sein.
Du möchtest ja "irgendeine" Datei (also eine vom Programm unabhängige Datei) für den Zugriff sperren. Das geht, wissen wir ja.
Du möchtest diese "irgendeine" Datei aber auch mit Shellexecute ausführen, also mußt Du sie für diesen Zugriff freigeben. Das geht auch, vielleicht reicht processmessages nicht aus (könnte an Cache etc. liegen). In Zweifelsfall kann man ein sleep(100 oder so) nachschalten. Hinterher greifst Du dir die Datei wieder und sperrst sie.
Also wenn ich Deine Aufgabe richtig verstanden habe, sollte es grundsätzlich gehen.

Grüße, Messie

Avax2k 19. Jan 2006 21:41

Re: Datei exklusiv öffnen
 
im Grundegenommen ist das schon richtig nur kann ich sie nicht sperren, weil sie ja dann von meinem Programm benutzt wird..

somit gilt leider..Sperrung möglich wenn mein Programm an der Datei nichts macht..wenn ich diese Öffnen will muss die solange ohne zugriffsicherung bleiben, bis ich sie nicht mehr brauche..und das bringt mir ergo nichts .

Christian Seehase 19. Jan 2006 21:50

Re: Datei exklusiv öffnen
 
Moin Zusammen,

Zitat:

Zitat von messie
//Shellexecute wartet auf die Beendigung des Aufrufs und gibt das Handle der aufgerufenen Datei zurück...

das stimmt nicht.
ShellExecute gibt einen Rückgabewert von > 32 wenn der Aufruf erfolgreich war, oder einen Wert <= 32 wenn ein Fehler aufgetreten ist.

(MSDN-Library durchsuchenShellExecute)

Die bei Delphi mitgelieferten Teile des SDK sind nicht gerade aktuell, besser wäre es, nach Möglichkeit, das aktuelle PSDK bei MS herunterzuladen (nach Möglichkeit, da ca. 350MB, bei vollem Download)

@Avax2k:
Das Problem wirst Du wohl nur lösen können, wenn Du die Datei selber verarbeitest.

Avax2k 19. Jan 2006 22:03

Re: Datei exklusiv öffnen
 
könnte ich es auch lösen indem ich einfach die Befehle von Windows abfange, bevor diese ausgeführt werden ? sprich jemand klickt auf kopieren und dann bei einfügen fängt das programm den Befehl ab und sagt nein..dabei würde es reichen das spezifisch auf den Dateinamen zu machen ...


genial wäre es, wenn ich in Windows komplett den "Kopieren"- Modus abschalten könnte solange mein Programm läuft wäre das umsetzbar?

marabu 20. Jan 2006 13:17

Re: Datei exklusiv öffnen
 
Ich frage halt nochmal nach: wie groß ist die Datei? Welchen Typ Daten enthält sie - Text, binär, strukturiert? Wie wird sie erstellt? Willst du die Datei nur vor fremden Zugriff schützen, während dein Programm läuft? Was ist mit der Datei, wenn dein Programm beendet wird?

Warum das ganze? Wenn du die richtigen Antworten auf diese Fragen gibst, dann gibt es vielleicht einen völlig anderen Lösungsansatz.

Grüße vom marabu

messie 20. Jan 2006 14:02

Re: Datei exklusiv öffnen
 
Zitat:

Zitat von Christian Seehase
das stimmt nicht. ShellExecute gibt einen Rückgabewert von > 32 wenn der Aufruf erfolgreich war, oder einen Wert <= 32 wenn ein Fehler aufgetreten ist.

In der API- Hilfe steht:

Zitat:

Return Values

If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.
If the function fails, the return value is an error value that is less than or equal to 32. The following table lists these error values:
Nur wartet die Funktion nicht, bis die Datei freigegeben ist, sondern gibt das Handle nach dem erfolgreichen Öffnen zurück. Damit ließe sich überwachen, wie lange die Datei in Gebrauch ist, um sie nach Benutzung wieder zu sperren. Aber ich weiß noch nicht, was Avax2k genau vorhat, jedenfalls ist es geheimnisvoll...

Grüße, Messie

Luckie 20. Jan 2006 14:12

Re: Datei exklusiv öffnen
 
Und das steht im aktuellen PSDK:
Zitat:

Return Value

Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.
Und deswegen hat Christian daraufhingewiesen, dass man sich auf die veraltete WINAPI Hilfe, die mit Delphi ausgeliefert wird, nicht verlassen soll. ;)

Avax2k 20. Jan 2006 14:25

Re: Datei exklusiv öffnen
 
Zitat:

Ich frage halt nochmal nach: wie groß ist die Datei? Welchen Typ Daten enthält sie - Text, binär, strukturiert? Wie wird sie erstellt? Willst du die Datei nur vor fremden Zugriff schützen, während dein Programm läuft? Was ist mit der Datei, wenn dein Programm beendet wird?

Warum das ganze?
1. Die Datei ist ca. 2MB
2. Datentyp ist Text
3. Wird beim Ausführen des Programmes erstellt indem sie umgewandelt wird und auf Platte geschrieben wird
4. Ja will einfach nur nicht, dass man sie kopieren kann..
5. Beim Programmende wird sie gelöscht

6. Der Grund ist wie gesagt, dass ich es verhindern möchte dass jemand die textdatei kopiert und ohne mein Programm benutzen kann.
Wenn ich wissen würde welche Date in Windows fürs Dateikopieren verantwortlich ist könnte ich diese mit FileStream zuweisen und das reicht auch vollkommen aus.
XCOPY.EXE ist es schonmal nicht..muss irgendeine andere datei sein die das macht.

messie 20. Jan 2006 14:49

Re: Datei exklusiv öffnen
 
Dann willst Du sie während der Programmausführung also im Windows-Editor-Fenster öffnen... was wenn Du auf Shellexecute verzichtest und dir selber einen Editor baust (gibts bestimmt auch fertig), kannst Du die Datei bei Start besetzen und zum Ende freigeben und dann löschen.

Grüße, Messie

Avax2k 20. Jan 2006 14:56

Re: Datei exklusiv öffnen
 
das wäre auch eine Möglichkeit nur einziges Problem dabei ist eben die Umsetzung, sprich um das zu realisieren müsste ich etwas größeres Schreiben.. dabei habe ich schon sowieso sehr viel um die Ohren. Wenn nun niemand einen Lösungsweg hat werde ich dies wohl dann auch tun müssen..mal abwarten :D

marabu 20. Jan 2006 15:59

Re: Datei exklusiv öffnen
 
Wenn du jetzt alle deine Anforderungen offen gelegt hast, dann frage ich mich warum du die Datei überhaupt erst im Dateisystem ablegen willst. Wenn nur deine Anwendung Zugriff haben soll, dann kannst du sie doch einfach in einen TMemoryStream schreiben und diesen so verwenden, als ob es eine Datei auf der Festplatte sei.

marabu

H4ndy 20. Jan 2006 16:20

Re: Datei exklusiv öffnen
 
Zitat:

Zitat von marabu
Wenn nur deine Anwendung Zugriff haben soll, dann kannst du sie doch einfach in einen TMemoryStream schreiben und diesen so verwenden, als ob es eine Datei auf der Festplatte sei.

So würde ich das auch machen. Da du die Datei selbst erstellst, kannst du Sie doch auch gleich
selber verarbeiten. Eine Textdatei anzuzeigen dürfte nun wirklich nicht so schwer sein, oder? :gruebel:

Um das Kopieren zu sperren, müsstest du einen nicht gerade trivialen Windows-Hook schreiben.
Ich fände es übrigends nicht wirklich prickelnd, wenn ein Programm mir das kopieren von Dateien
verbieten würde...

SirThornberry 20. Jan 2006 16:44

Re: Datei exklusiv öffnen
 
ein Programm wie Notepad ist doch nicht schwer umzusetzen, vor allem nicht wenn du speichern, öffnen, drucken etc. weglässt. Dann brauchst du nur ein form bauen, darauf ein TRichEdit (vielleicht reicht sogar ein TMemo) und darin deinen Text anzeigen.

Ich denke jedoch das du allgemein den falschen Lösungsansatz hast. Denn du brauchst ja auch ein weilschen vom erstellen der Datei bis zum exclusiven öffnen mit TFileStream. Und in der zwischenzeit kann die Datei schon gelesen werden. Du solltest also versuchen vollständig auf das schreiben auf die Festplatte zu verzichten.

ichbins 20. Jan 2006 17:05

Re: Datei exklusiv öffnen
 
es nützt dir ÜBERHAUPT nichts, die Datei mit notepad zu öffnen, damit der User sie nicht kopieren kann, denn mit Notepad lässt sich die Datei ja irgendwo anderst wieder speichern und ist somit kopiert. Außerdem lässt sich dein Programm per Taskmanager -> Prozess beenden abwürgen, so dass es garkeine Zeit hat, die Datei wieder zu löschen. Das kriegt jeder mittelmäßige User hin.

Einen eigenen txt-Editor bauen: du nimmst eine Komponente TMemo, peppst die auf die Form, wenn sie nicht verändert werden darf, stellst du readonly auf true, und mit memo1.loadfromfile(filename) kannst du die Datei dann reinladen. Du musst die Datei nichtmal speichern, sondern kannst sie ja gleich dierekt in das Memo laden:
Delphi-Quellcode:
memo1.lines.add('Zeile 1');
memo1.lines.add('Zeile 2');
...
generell zu deiner Temporären Datei:
Speichere die Datei NIEMALS dierekt auf Laufwerk C: !!!
denn:
  • Der User will seine Festplatte möglichst sauber halten
  • Das Betriebssystem könnte dir einen solchen Schreibzugriff verbieten, speziell der xp-Nachfolger Vista
  • Es könnte auch andere Programme geben, die da schon eine solche Datei gespeichert haben.

weshalb du keine temporären Dateien anlegen solltest:
  • Geschwindigkeit der Festplatte: 15 MB/s, Geschwindigkeit des RAM-Speichers: 400 MB/s
  • Festplattenspeicher wird verbraucht
  • Die Festplatte ist immer irgendwie auslesbar (selbst nach 30-fachem Überschreiben)

Avax2k 20. Jan 2006 17:14

Re: Datei exklusiv öffnen
 
ja abwürgen wird man mein Programm immer können, dies zu verhindern ist schier unmöglich..wenn man jetzt nicht gerade den Benutzer vollkommen aus Windows sperren will.

bleibt mir dann wohl nichts anderes übrig als die Datei die ganze Zeit im Programm laufen lassen.

Danke euch trotzdem für die rege Anteilnahme

messie 22. Jan 2006 21:54

Re: Datei exklusiv öffnen
 
Zitat:

Zitat von ichbins
e
Speichere die Datei NIEMALS direkt auf Laufwerk C: !!!

Hallo,
ist vielleicht etwas Offtopic, trotzdem hier die Frage: welche Speicherorte läßt XP (von Vista nicht zu sprechen) überhaupt zu?
Ich habe vor kurzem versucht eine kleine Anwendung als Installation auf internationalen Systemen mit Gast-Rechten zur Verfügung zu stellen - es blieb wie zu alten DOS-Zeiten nur die Möglichkeit, auf C: ein Verzeichnis anzulegen. Direkt auf C:\ gespeicherte Dateien stehen anderen User nicht zur Verfügung, nur die, für die ein Verzeichnis angelegt wurde.
Vielleicht auch ein neues, eigenes Thema?
Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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