Entwickler-Ecke

Dateizugriff - wird die datei benutzt?


hibbert - Mi 05.11.03 16:51
Titel: wird die datei benutzt?
Hi,
mist, ich habe mal wieder was vergessen und zwar will ich ne abfrage machen, ob die datei schon ausgeführt wurde bzw. ob die Datei von Windows schon benutzt wird.

Da war mal was mit if file danbn irgendwas mit is in use (oder so) und dass der Pfad der datei.

Wer kann mir auf die sprünge helfen?

thx hibbert.


bIce - Mi 05.11.03 19:28

Willst Du prüfen ob eine Datei von Windows gerade benutzt wird, oder? Wenn ja verwende einfach FileAge(), wenn die Datei gesperrt ist kommt es zu einer Exception (zumindest unter Win98).
Eine mögliche Funktion wäre:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function fileInUse(filePath: String) : Boolean;
begin
   Result := false;
   try
      FileAge(filePath);
   except
      Result := true;
   end;
end;


Delete - Mi 05.11.03 20:14

Wird aber nur funktionieren, wenn die Datei exklusiv geöffnet ist.


hibbert - Do 06.11.03 00:00

naja, vielleicht habe ich mich ja oben etwas falsch ausgedrückt, ich meinte ob eine Datei verwendet wird (nicht speziell von Windows). egal, ob sie in einem Texteditor oder von einem anderen Programm geöffnet bzw. benutzt wird.

ich meine da gab bzw. gibt es so was if fileisinuse oder so ähnlich.

thx hibbert


bIce - Fr 07.11.03 20:41

IMO ist das unmöglich, die Datei wird ja einfach eingelesen und geschlossen, im Arbeitsspeicher ist dann ein Abbild der Datei, dass Du mit dem Editor verändern kannst. Ich weiß nicht wie das mit Notepad aussieht aber mit den Edit-Komponenten (auch TMemo, TRichEdit und TSynEdit) funktionieren so. D.h. man kann nur während die Datei gespeichert, bzw. gelesen wird, festestellen ob auf sie zugegriffen wird.


Jörg Oulabi - So 09.11.03 02:09
Titel: Re: wird die datei benutzt?
Hi...

Also... ich hatte da gleiche Problem.
Erst musste ich eine Datei schreiben und diese dann gleich danach wieder öffnen um sie weiter zu bearbeiten. Das Problem war, das die zuerst erzeugte Datei ziemlich gross und sie wurde mit der Abfrage "fileexists" schon erkannt bevor sie wieder geschlossen wurde. Ein zu schneller Zugriff bevor die Datei fertig geschrieben und geschlossen wurde führte dann zu einer Exception.
Ich hab das Problem dann so gelöst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
repeat   {sicherstellen u. warten bis datei erzeugt wurde}
  Application.ProcessMessages;
   AssignFile(in_datei, 'c:\odas\ges_export.txt');
   {$I-}
   reset(in_datei);
   {$I+}
   f:=IoResult;
 until f=0;
 CloseFile(in_datei);


Beste Grüsse
Jörg


jaenicke - Mo 10.11.03 14:01
Titel: Wie wär's damit?
Hallo!

Wie wäre es mit folgendem Sourcecode von Scalabium.com:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function FileInUse(FileName: string): Boolean;
var hFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then exit;
  hFileRes := CreateFile(PChar(FileName),
                                    GENERIC_READ or GENERIC_WRITE,
                                    0,
                                    nil,
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL,
                                    0);
  Result := (hFileRes = INVALID_HANDLE_VALUE);
  if not Result then 
    CloseHandle(hFileRes);
end;


Die vorher von Jörg angegebene Methode funktioniert ähnlich, aber ich finde das so am besten, vor allem weil die Fehlerbehandlung, die bei Jörg abgeschaltet wurde, dort von der Funktion intern übernommen wird.

Gruß,
S.J.