Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf Datei gescheitert, von anderem Prozess verwendet (https://www.delphipraxis.net/126302-zugriff-auf-datei-gescheitert-von-anderem-prozess-verwendet.html)

Berlinermauer 22. Dez 2008 12:57


Zugriff auf Datei gescheitert, von anderem Prozess verwendet
 
Hi, im Folgenden Code Speicher ich ein Memo als .log Datei.
Bekomme den Fehler, dass diese Datei angebl. von einem Anderen Prozess benutzt wird.

Dies macht aber kein Sinn, da die Datei grad davor erstellt wurde, AntiVirus aus ist usw..

Delphi-Quellcode:
procedure Get_Logdir;
begin
if DirectoryExists (ExtractFilePath(ParamStr(0)) + 'Logs') then
  begin
   s := './logs/' + FormatDateTime('dd-mm-yyyy',Now) + '.log';

  AssignFile(Log,s);
  rewrite(log);
  end
dann im OnCreate Get_Logdir.

Delphi-Quellcode:
Log.Lines.SavetoFile(s);
<-- Hier kommt der Fehler

DeddyH 22. Dez 2008 13:00

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zum Einen sollte man im eigenen Programmverzeichnis bzw. Unterordnern davon nicht schreiben, zum Anderen fehlt da irgendwie ein CloseFile.

khh 22. Dez 2008 13:03

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von DeddyH
Zum Einen sollte man im eigenen Programmverzeichnis bzw. Unterordnern davon nicht schreiben,


OT: kannst du das bitte mal begründen.


Gruss Kh

toms 22. Dez 2008 13:04

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von khh
Zitat:

Zitat von DeddyH
Zum Einen sollte man im eigenen Programmverzeichnis bzw. Unterordnern davon nicht schreiben,

OT: kannst du das bitte mal begründen.

Da nicht alle Schreibrechte im Programmverzeichnis haben.

DeddyH 22. Dez 2008 13:05

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Ja, kann ich. Wenn Du unter XP/Vista als Nicht-Admin unterwegs bist, hast Du schlicht keine Rechte dazu.

khh 22. Dez 2008 13:06

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von DeddyH
Ja, kann ich. Wenn Du unter XP/Vista als Nicht-Admin unterwegs bist, hast Du schlicht keine Rechte dazu.

also schreibts du ins user -verzeichnis?
Das ist unter Vista etwas kompliziert, oder ?

DeddyH 22. Dez 2008 13:08

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Ich hab kein Vista, aber das User-Verzeichnis zu ermitteln dürfte nicht schwerer sein als unter XP (es sei denn, da ist etwas an mir vorbeigegangen).

khh 22. Dez 2008 13:09

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von DeddyH
Ich hab kein Vista, aber das User-Verzeichnis zu ermitteln dürfte nicht schwerer sein als unter XP (es sei denn, da ist etwas an mir vorbeigegangen).

muss ich mir mal zu gemüte führen

Meflin 22. Dez 2008 13:12

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von khh
Das ist unter Vista etwas kompliziert, oder ?

Ganz im Gegenteil. Wenn du mit mangelnden Rechten in Vista ins Programm-Verzeichnis schreiben willst, landet das sogar ganz automatisch im Roaming-Ordner deines User-Verzeichnisses :mrgreen:

Uwe Raabe 22. Dez 2008 13:15

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von Berlinermauer
Delphi-Quellcode:
procedure Get_Logdir;
begin
if DirectoryExists (ExtractFilePath(ParamStr(0)) + 'Logs') then
  begin
   s := './logs/' + FormatDateTime('dd-mm-yyyy',Now) + '.log';

  AssignFile(Log,s);
  rewrite(log);
  end
dann im OnCreate Get_Logdir.

Delphi-Quellcode:
Log.Lines.SavetoFile(s);
<-- Hier kommt der Fehler

Du scheinst hier die Variable Log in unterschiedlichen Ausprägungen zu benutzen: Auf der einen Seite wird sie mit AssignFile und Rewrite wie ein File oder TextFile verwendet, auf der anderen Seite aber mit Log.Lines.SaveToFile wie ein TMemo. Vermutlich handelt es sich um zwei verschiedene Variablen, aber das geht aus den Code-Snippets nicht hervor.

Bemerkenswert ist aber, daß im Get_LogDir ein File geöffnet wird (warum?) und dieses anscheinen auch bleibt. Das hat allerdings zur Folge, daß die Datei gesperrt ist und somit ein nachfolgendes SaveToFile auf den gleichen Dateinamen schiefgehen muss.

DeddyH 22. Dez 2008 13:16

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
MSDN-Library durchsuchenSHGetFolderPath mit CSIDL_APPDATA ist in meinen Augen nicht soooo kompliziert ;)

[edit]
Zitat:

Zitat von Uwe Raabe
Bemerkenswert ist aber, daß im Get_LogDir ein File geöffnet wird (warum?) und dieses anscheinen auch bleibt. Das hat allerdings zur Folge, daß die Datei gesperrt ist und somit ein nachfolgendes SaveToFile auf den gleichen Dateinamen schiefgehen muss.

Deshalb meinte ich ja, da fehlt ein CloseFile. Wobei man sich wirklich fragt, wozu die Datei vorher angelegt wird :gruebel:[/edit]

SirThornberry 22. Dez 2008 13:59

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von Meflin
Zitat:

Zitat von khh
Das ist unter Vista etwas kompliziert, oder ?

Ganz im Gegenteil. Wenn du mit mangelnden Rechten in Vista ins Programm-Verzeichnis schreiben willst, landet das sogar ganz automatisch im Roaming-Ordner deines User-Verzeichnisses :mrgreen:

Was passiert dann wenn man nachträglich die nötigen Rechte bekommt? wird dann zukünftig weiterhin diese genutzt oder wird eine neue angelegt?

Christian Seehase 22. Dez 2008 14:04

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Moin,

was mir noch aufgefallen ist:
Du prüfst zwar den vollen Pfad, benutzt dann aber zum Speichern einen relativen (./logs).
Das kann auch schiefgehen.

Berlinermauer 22. Dez 2008 14:55

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Also ich wollte damit bezwecken, dass der Text nicht überschrieben sondern erweitert wird.

DeddyH 22. Dez 2008 14:58

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Dann fallen mir spontan 2 Möglichkeiten ein: eine Stringlist erzeugen, alten Inhalt hineinladen und mit Addstrings anfügen oder Datei nicht mit Rewrite, sondern ggf. mit Append öffnen.

Meflin 22. Dez 2008 15:00

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von SirThornberry
Was passiert dann wenn man nachträglich die nötigen Rechte bekommt? wird dann zukünftig weiterhin diese genutzt oder wird eine neue angelegt?

Ich habe erlichgesagt keine Ahnung. Normalerweise müsste eine neue angelegt werden - die Frage wäre dann, ob die alte dabei berücksichtigt wird oder nicht :gruebel:

Ergänzend sei gesagt: das genaue Verzeichnis ist nicht Roaming, sondern Local\VirtualStore und das funktioniert auch "nur" bei Anwendungen, die kein Vista-Manifest haben (oder allen die im Kompatibilitätsmoduis ausgeführt werden) :)

Berlinermauer 23. Dez 2008 19:00

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
naja mit Append scheint auch nicht zu funktionieren.

Ich glaube aber es liegt daran dass ich bei jeder neuempfangenen ChatNachricht wieder den ganzen log reinschreib.

weiß jemand wie ich es besser machen könnte?

DeddyH 23. Dez 2008 19:02

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Zitat:

Zitat von Berlinermauer
naja mit Append scheint auch nicht zu funktionieren.

:glaskugel: :?:

Berlinermauer 23. Dez 2008 19:28

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
wenn ich statt "ReWrite", "Append" eingebe funktioniert es trotzdem noch nicht

DeddyH 23. Dez 2008 19:39

Re: Zugriff auf Datei gescheitert, von anderem Prozess verwe
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const sDateiname = 'C:\Test.txt'; //nur zum Testen
var F: TextFile;
begin
  AssignFile(F,sDateiname);
  {$I-}
  if FileExists(sDateiname) then
    Append(F)
  else
    Rewrite(F);
  {$I+}
  if IOResult = 0 then
    begin
      writeln(F,'Eine weitere Zeile');
      CloseFile(F);
    end
  else
    ShowMessage(Format('IOResult = %d',[IOResult]));
end;


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