Tech-Ecke / Delphi Inhalt / Datei- und Verzeichnisoperationen

 

     Datei- und Verzeichnisoperationen

 

   Allgemeines

 

Datei vorhanden?

   if FileExists('C:\Datei.txt')= false then ...   // mach was   -   bei Variablen PChar() verwenden
 

Verzeichnis vorhanden?

   if DirectoryExists('C:\Ordner')= false then ...   // bei Variablen PChar() verwenden
 

Löschen einer Datei

   DeleteFile('C:\Datei.txt');   // bei Variablen PChar() verwenden
 

Kopieren einer Datei

   CopyFile(PChar('C:\Datei.txt'), PChar('D:\Datei.txt'), false);   // false = Überschreibe wenn vorhanden, true = nicht überschreiben!
 

Kopieren eines Ordners (mit Inhalt)

  function CopyDir(const VonVerzeichnis, NachVerzeichnis: string): Boolean;
var
   fos: TSHFileOpStruct;
begin
   ZeroMemory(@fos, SizeOf(fos));
  
with fos do
     
begin
         wFunc := FO_COPY;
         fFlags := FOF_FILESONLY
or FOF_SILENT or FOF_NOCONFIRMATION;
         pFrom := PChar(VonVerzeichnis + #0);
         pTo := PChar(NachVerzeichnis)
  
   end;
   Result := (0 = ShFileOperation(fos));
end;

Quelle: DelphiPraxis.net

Anwendung:

   CopyDir('C:\Verzeichnis','D:\Verzeichnis');   // kopiert den Ordner mit Inhalt

CopyDir('C:\Verzeichnis\*.*','D:\Verzeichnis');   // kopiert den Inhalt des Ordners

 

Datei verschieben

   MoveFile(‘C:\Datei.txt’, ‘D:\Datei.txt’);   // bei Variablen PChar() verwenden
 

Datei umbenennen

   RenameFile('C:\Datei.txt' , 'C:\DateiNeu.tx');   // bei Variablen PChar() verwenden
 

Verzeichnis löschen

   RemoveDir('C:\Ordner'); // funktioniert nur wenn der Ordner leer ist!
 

Löschen eines Verzeichnisses samt Inhalt

Um einen Ordner samt seines Inhalts zu löschen kann man sich folgender Funktion bedienen. benötigt ShellApi in Uses

  function DelDir(dir: string): Boolean;
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  
with fos do
  
begin
    wFunc := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom := PChar(dir + #0);
  
end;
  Result := (0 = ShFileOperation(fos));
end;

Quelle: DelphiPraxis.net

Aufruf:

   DelDir('C:\Ordner');
 

Verzeichnis erstellen

   CreateDir('C:\Ordner');   // bei Variablen PChar() verwenden
 

Verzeichnis mit Unterverzeichnis erstellen

   var
        Dir: String;

        Dir := (
'C:\Ordner\UnterOrdner\UnterUnterOrdner');
        ForceDirectories(Dir);
 

   Datei-Attribute setzen

   
        SetFileAttributes('Datei.txt', FILE_ATTRIBUTE_HIDDEN + FILE_ATTRIBUTE_READONLY )
        // Befindet sich der Dateiname in einer Variablen -> PChar(Variable)

FILE_ATTRIBUTE_ARCHIVE //Das Archiv-Symbol (a).
FILE_ATTRIBUTE_HIDDEN //Versteckt eine Datei.
FILE_ATTRIBUTE_NORMAL //Keine Attribute
FILE_ATTRIBUTE_OFFLINE //Die Datei wird offline Verfügbar gemacht.
FILE_ATTRIBUTE_READONLY //Read-Only Attribut (Schreibgeschützt).
FILE_ATTRIBUTE_SYSTEM //Systemdateien haben dieses Attribut

 

   Ordner wählen – benötigt FileCtrl in uses! 
 

   var
Ordner: String;

if SelectDirectory(('bla bla'),('C:\'),Ordner) then // als Startverzeichnis wurde C:\ gesetzt - nicht gewünscht dann ('')
   
begin
        ShowMessage('gewählter Ordner: ' + Ordner);
        { mach irgendwas was }
   
end
else
   
ShowMessage('nix ausgewählt...'); // oder einfach nur exit;

 

   Verzeichnis auslesen mit TSearchRec in ListBox1 auf Form1
 

  var
     SR: TSearchRec;
     dir: String;
begin
dir := ('c:\');
if FindFirst(dir+'*.*',faAnyFile,SR) = 0 then
begin

   repeat
      ListBox1.Items.add(sr.name + '     ' + DateToStr(sr.Time)); // oder mit Angabe der Dateigröße IntToStr(SR.Size)
   until FindNext(SR)<>0;
   FindClose(SR); //Nach jedem findfirst nötig, um sr freizugeben!
end;
end;
 

   Dateigröße ermitteln benötigt ShellAPI in uses

  function GetFileSize(const szFile: String): Int64;
var
   fFile: THandle;
   wfd: TWIN32FINDDATA;
begin
   result := 0;
   if not FileExists(szFile) then exit;
   fFile := FindFirstfile(pchar(szFile),wfd);
   if fFile = INVALID_HANDLE_VALUE then exit;
   result := (wfd.nFileSizeHigh*(MAXDWORD))+wfd.nFileSizeLow;
   windows.FindClose(fFile);
end;
 

Oder Alternative per TSearchRec:

  function GetFileSize(const DateiPfad: string): Int64;
var
  SR: TSearchRec;
  OldMode: Cardinal;
  Size: TULargeInteger;
begin
  Result := -1;
  OldMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if FindFirst(DateiPfad, faAnyFile, SR) = 0 then
    begin
      Size.LowPart := SR.FindData.nFileSizeLow;
      Size.HighPart := SR.FindData.nFileSizeHigh;
      Result := Size.QuadPart;
      SysUtils.FindClose(SR);
    end;
  finally
    SetErrorMode(OldMode);
  end;
end;
 

Aufruf:    

   Showmessage(IntToStr(GetFileSize('C:\Datei.txt'))); // in Byte


 

   Ordergröße ermitteln - inkl. aller Dateien und Unterordner

  function GetDirSize(dir: String; subdir: Boolean): Int64;
var
  rec: TSearchRec;
  found: Integer;
begin
  Result := 0;
  if dir[Length(dir)] <> '\' then dir := dir +'\';
  found := FindFirst(dir + '*.*', faAnyFile, rec);
  while found = 0 do
    begin
      Inc(Result, rec.Size);
      if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and (subdir = true) then
          Inc(Result, GetDirSize(dir + rec.Name, true));
      found := FindNext(rec);
    end;
  FindClose(rec);
end;
   

 

Beispiele:    

   Showmessage(IntToStr(GetDirSize('C:\Ordner', true))); // mit Unterordner in Byte

 Showmessage(IntToStr(GetDirSize('C:\Ordner', false))); // ohne Unterordner in Byte
 


 

   Änderungsdatum einer Datei oder eines Verzeichnis ermitteln

  function GetFileDate(const AFileName: string): TDateTime;
var
      SR: TSearchRec;
      SystemTime: TSystemTime;
      ModTime: TFileTime;
begin
Result:=0;
if FindFirst(AFileName, faAnyFile, SR)=0 then
 try
   if (Windows.FileTimeToLocalFiletime(SR.FindData.ftLastWriteTime, ModTime)
and
   Windows.FileTimeToSystemTime(ModTime, SystemTime))
then
   Result:=Encodedate(SystemTime.wYear,
   SystemTime.wMonth,
   SystemTime.wDay) +
   Encodetime(SystemTime.wHour,
   SystemTime.wMinute,
   SystemTime.wSecond,
   SystemTime.wMilliseconds);
 finally
   SysUtils.FindClose(SR)
 end;
end;
   

Quelle: Delphi-Treff

Beispiele:    

   Showmessage(DateTimeToStr(GetFileDate('C:\Datei.txt')));
 

Die Anwendung gibt des letzten Schreibzugriff zurück. Mögliche Rückgaben: ftCreationTime; ftLastAccessTime; ftLastWriteTime

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 15.02.2015]