Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Feststellen ob eine Datei unbenutzt ist (https://www.delphipraxis.net/56055-feststellen-ob-eine-datei-unbenutzt-ist.html)

Helmi 31. Okt 2005 13:08


Feststellen ob eine Datei unbenutzt ist
 
Hallo,

wie kann ich feststellen, ob eine Datei, jeglicher Art, unbenutzt ist?

Bei den Schweizern gibt es zwar einen Code, aber ich musste schon feststellen,
dass dieser Code einmal funktioniert und einmal nicht - nicht zuverlässig!

Schweizer-Link

sh17 31. Okt 2005 13:27

Re: Feststellen ob eine Datei unbenutzt ist
 
Delphi-Quellcode:
function IsFileInUse(const 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;

Helmi 31. Okt 2005 13:30

Re: Feststellen ob eine Datei unbenutzt ist
 
na genau diesen code meinte ich ja, dass der nicht so richtig geht - siehe meinem posting und dem link

SirThornberry 31. Okt 2005 13:32

Re: Feststellen ob eine Datei unbenutzt ist
 
Der Source funktioniert schon, allerdings wird da nur versucht die Datei exclusiv zu öffnen. Wenn dies durch die bereits geöffnete instanz erlaubt ist komme aber auch kein Fehler.

sh17 31. Okt 2005 13:38

Re: Feststellen ob eine Datei unbenutzt ist
 
Und wenn die andere Instanz das zulässt, dann sollte es für Dich doch kein Problem sein. Die andere Instanz muss ja wissen, was sie macht. Du könntest ihr ja die Datei "unterm Hintern" weglöschen.

ichbins 31. Okt 2005 13:43

Re: Feststellen ob eine Datei unbenutzt ist
 
Du könntest ja einfach versuchen die File mit vollen schreibzugriffsrechten zu öffnen:
Delphi-Quellcode:
function fileinuse(filename:string):boolean;
var
  f:file;
begin
  result:=true;
  try begin
    assignfile(f,filename);
    filemode:=2;
    reset(f);
    result:=false;
    closefile(f);
  except end;
end;

Helmi 31. Okt 2005 13:46

Re: Feststellen ob eine Datei unbenutzt ist
 
Ich hab festgestellt, dass der Code bei mir ned so richtig funktioniert!

Ich kopiere in meinem Programm eine Datei von einem Rechner in einen Ordner eines anderen Rechners. Bevor ich dies aber mache, prüfe ich ob 1. schon diese Datei auf dem zweiten Rechner vorhanden ist und falls ja dann wird 2. geprüft ob diese Datei unbenutzt ist.
Dies mach ich eben mit dem oben stehenden Code, bzw. mit dem Code von den Schweizern (was ja der gleiche ist).

Ich stelle immer wieder fest, dass die function eine Datei als benutzt meldet, obwohl es aber möglich ist, diese Datei im Windows-Explorer ohne jegliche Probleme zu kopieren, bzw. zu überschreiben.

ichbins 31. Okt 2005 13:49

Re: Feststellen ob eine Datei unbenutzt ist
 
schau mal den Code, den ich geschrieben hab. Der überprüft einfach, ob die Datei für den Schreibzugriff geöffnet werden kann, egal an was es jetzt liegt, dass sie nicht geöffnet werden kann, ob sie nicht existiert, geöffnet ist usw...

Delphi-Quellcode:
function fileinuse(filename:string):boolean;
var
  f:file;
begin
  result:=true;
  try begin
    assignfile(f,filename);
    filemode:=2;
    reset(f);
    result:=false;
    closefile(f);
  except end;
end;

Helmi 31. Okt 2005 14:04

Re: Feststellen ob eine Datei unbenutzt ist
 
na ja - ich weiss nicht
die "Prüfung" auf eine Exception zu stützen
ob das so gut ist? :gruebel:

SirThornberry 31. Okt 2005 14:06

Re: Feststellen ob eine Datei unbenutzt ist
 
@Helmi: Dein Source macht doch auch nix anderes. Wenn die Datei nicht exlusiv geöffnet werden konnte wird 0 zurück gegeben was einem Fehler entspricht. Also wird da auch nur versucht ob etwas funktioniert ohne einen Fehler zu werfen

Helmi 31. Okt 2005 14:08

Re: Feststellen ob eine Datei unbenutzt ist
 
oki
danke

dann werd ich mal schauen was ich ändern kann

Delphi-Freak 17. Apr 2006 18:45

Re: Feststellen ob eine Datei unbenutzt ist
 
Auch wenn das Topic schon einige Zeit her ist...
Ich finde, dass die erste Version (mit CreateFile) eigentlich zuverlässiger arbeitet, ich habe keine Probleme mit einmal schon, einmal nicht. Ein Test, wo ich eine 70MB-Datei mit meinem eigenen Editor geöffnet habe (via FileStream mit fmOpenRead or fmShareDenyNone), ergibt mit dieser Version auch True, mit der anderen aber false...
Außerdem hat sie den Vorteil, dass man nicht mit Exceptions arbeiten muss, die im Debugger trotz try...except angezeigt werden...

LG, ich

Mackhack 17. Apr 2006 18:54

Re: Feststellen ob eine Datei unbenutzt ist
 
Hi,

vielleicht hilft dir das weiter...

MSDN-Library durchsuchenFindNextChangeNotification

Delphi-Freak 17. Apr 2006 18:58

Re: Feststellen ob eine Datei unbenutzt ist
 
Irgendwie check ich da den Zusammenhang nicht... habe ich eine Frage gestellt, eigentlich hätte ich keine stellen wollen :gruebel:

zeras 1. Jan 2009 16:54

Re: Feststellen ob eine Datei unbenutzt ist
 
Zur Info, wenn jemand Probleme mit dieser Funktion unter Win98 hat.

Ich hatte Probleme mit dieser Funktion, wenn das Programm unter Win98 läuft.

Aber das wissen die Win-Experten besser, warum.

Delphi-Quellcode:
function IsFileInUse(const FileName: String): Boolean;
var
  HFileRes : HFILE;
begin
  Result := false;
  if not FileExists(FileName) then exit;

  //Probleme mit Win98, aber unter XP OK
  //HFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
 
  //läuft offensichtlich unter 98 und XP
  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;


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