![]() |
Datei exklusiv öffnen
Hi hab folgenden Code
Delphi-Quellcode:
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 ?
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; Danke schonmal für die Hilfe |
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:
Erst wenn Du den FileStream freigibts, kann wieder anderweitig auf die Datei zugegriffen werden.
Fs := TFilestream.create(...)
FS.Read(var Buffer; Count: Longint): Longint;//das schaust Du in der Hilfe nach Grüße, Messie |
Re: Datei exklusiv öffnen
Hi,
und außerdem musst du etwas mehr auf die Syntax achten:
Delphi-Quellcode:
Grüße vom marabu
var
fs: TFileStream; begin fs := TFileStream.Create(FileName, fmOpenRead, fmShareExclusive); // ... fs.Free; end; |
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 :(.
|
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 |
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() |
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 |
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. |
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 |
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 |
Re: Datei exklusiv öffnen
klappt leider auch nicht
Delphi-Quellcode:
geht leider auch nicht :(
FreeAndNil(fs);
ShellExecute(0, 'OPEN', PChar(FILE_NAME),nil,nil,0); fs:=TFileStream.Create(FILE_NAME, fmOpenRead); |
Re: Datei exklusiv öffnen
Schreib' mal, was genau nicht klappt..
Grüße, Messie |
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 |
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.
|
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. |
Re: Datei exklusiv öffnen
Zitat:
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(...); |
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:
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.
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); |
Re: Datei exklusiv öffnen
Zitat:
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 |
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 . |
Re: Datei exklusiv öffnen
Moin Zusammen,
Zitat:
ShellExecute gibt einen Rückgabewert von > 32 wenn der Aufruf erfolgreich war, oder einen Wert <= 32 wenn ein Fehler aufgetreten ist. ( ![]() 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. |
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? |
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 |
Re: Datei exklusiv öffnen
Zitat:
Zitat:
Grüße, Messie |
Re: Datei exklusiv öffnen
Und das steht im aktuellen PSDK:
Zitat:
|
Re: Datei exklusiv öffnen
Zitat:
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. |
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 |
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
|
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 |
Re: Datei exklusiv öffnen
Zitat:
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... |
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. |
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:
generell zu deiner Temporären Datei:
memo1.lines.add('Zeile 1');
memo1.lines.add('Zeile 2'); ... Speichere die Datei NIEMALS dierekt auf Laufwerk C: !!! denn:
weshalb du keine temporären Dateien anlegen solltest:
|
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 |
Re: Datei exklusiv öffnen
Zitat:
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