Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   [.] und [..] NICHT auflisten. (https://www.delphipraxis.net/156538-%5B-%5D-und-%5B-%5D-nicht-auflisten.html)

Kieni 6. Dez 2010 13:31

[.] und [..] NICHT auflisten.
 
Hallo,

ich bins mal wieder :)

Habe mal eine Frage zu folgendem Code:
Code:
begin
  s := FindFirst('R:\*.*', faDirectory, f);
  try
    while s = 0 do
    begin
       if f.Attr and faDirectory = faDirectory then
         ListBox1.Items.Add(f.Name);
         s := FindNext(f);
    end;
  finally
    FindClose(f);
  end;
end;
Problem: Beim Auslesen des Verzeichnisses werden '.' und '..' mit aufgelistet. Die Frage, die ich mir jetzt stelle:

if f.name = '.' then .... mach irgendwas --> funktioniert
if not f.name = '.' then ... mach etwas ----> funktioniert NICHT (Fehlermeldung: Operator ist auf diesen Operandentyp nicht anwendbar)

WARUM ????

Gruß Kieni

mleyen 6. Dez 2010 13:35

AW: [.] und [..] NICHT auflisten.
 
Delphi-Quellcode:
if not (f.name = '.') then
oder schöner:
Delphi-Quellcode:
if f.name <> '.' then

himitsu 6. Dez 2010 13:35

AW: [.] und [..] NICHT auflisten.
 
Klammern setzten?
Delphi-Quellcode:
if not (f.name = '.') then
.
NOT hat Vorrang vor =, was dann für den Compiler
Delphi-Quellcode:
if (not f.name) = '.' then
bedeuten würde.

Ansonsten ... wozu NOT?
Delphi-Quellcode:
if f.name <> '.' then
, bzw
Delphi-Quellcode:
if (f.name <> '.') and (f.name <> '..') then
.

[edit]
zu langsam :?

Kieni 6. Dez 2010 13:38

AW: [.] und [..] NICHT auflisten.
 
oh mann.... ! :shock:

Danke... funzt EINWANDFREI :)

Kieni 6. Dez 2010 15:40

AW: [.] und [..] NICHT auflisten.
 
grrrrrrrrrrrrrrrrrrrrrrrrr....

ich verstehe es einfach nicht, und so langsam verliere ich die Geduld ..:(

der folgende code macht im groben und ganzen was er soll: kopiere das R:\ laufwerk nach C:\FSS-Backup.

Code:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TBack_it_up = class(TForm)
    cmd_start: TButton;
    cmd_close: TButton;
    lbl_start: TLabel;
    lbl_stop: TLabel;
    lbl_start_2: TLabel;
    lbl_stop_2: TLabel;
    lbl_status: TLabel;
    procedure cmd_startClick(Sender: TObject);
    procedure cmd_closeClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  Function DeleteDir(DirName : string): Boolean;
  function Sh_FileCopyMove(aWND: HWND; const Source,Dest: string; DoMove: boolean;
          var IsAborted: boolean; Flags: FILEOP_FLAGS=0): Boolean;


var
  Back_it_up: TBack_it_up;

const
  backup_this = 'R:\';
  backup_new = 'C:\Backup-FSS';
  backup_old = 'C:\Backup-FSS(Old)';


implementation

{$R *.dfm}

procedure TBack_it_up.cmd_startClick(Sender: TObject);

var
  IsAborted: boolean;
  f : TSearchRec;
  s : Integer;

begin
  cmd_start.Enabled:=false;

  lbl_start_2.Caption:=DateTimeToStr(Now);
  Application.ProcessMessages;


if DirectoryExists(backup_old) then DeleteDir(backup_old);
if DirectoryExists(backup_new) then MoveFile(backup_new, backup_old);

begin
  s := FindFirst(backup_this + '*.*', faDirectory, f);
  try
    while s = 0 do
    begin
       if f.Attr and faDirectory = faDirectory then
        if (f.name <> '.') and (f.name <> '..') then
        begin
          lbl_status.Caption:='Current directory: ' + f.Name;
          Application.ProcessMessages;
          Sh_FileCopyMove(Back_it_up.Handle, backup_this+f.Name, backup_new, false, IsAborted)
        end;
        s := FindNext(f);
    end;

  finally
    FindClose(f);
  end;
end;

lbl_stop_2.caption:=DateTimeToStr(Now);
lbl_status.Caption:='Backup completed';
end;
Das einzige Manko: Der erste Ordner wird nicht angelegt, sondern alle Unterordner einfach im root Fss-Backup abgelegt ... Ich habe nicheinmal ne idee.... Einer von euch eventuell?

Beispiel:

Laufwerk R:\
Ordner1\01_1
Ordner1\01_2
Ordner1\01_3
Ordner2\02_1
Ordner2\02_2
Ordner2\02_3

Programmdurchlauf

C:\Backup-FSS\01_1
C:\Backup-FSS\01_2
C:\Backup-FSS\01_3
C:\Backup-FSS\Ordner2\02_1
C:\Backup-FSS\Ordner2\02_2
C:\Backup-FSS\Ordner2\02_3

Ich hoffe ihr versteht was ich meine....Ordner1 wird einfach nicht angelegt!

Gruß Kieni

DeddyH 6. Dez 2010 16:14

AW: [.] und [..] NICHT auflisten.
 
Wäre es nicht einfacher, rekursiv zu kopieren, statt diesem Mischmasch aus FindFirst und SHFileOperation?

Hobby-Programmierer 6. Dez 2010 17:25

AW: [.] und [..] NICHT auflisten.
 
Wo wird der Ordner backup_new nach dem löschen neu erstellt?
Edit: Sollte es nicht heissen
Delphi-Quellcode:
if (f.name <> '.') or (f.name <> '..')

p80286 6. Dez 2010 17:49

AW: [.] und [..] NICHT auflisten.
 
Die Benutzung des Debuggers würde hier weiter helfen.
Dann ist man nicht so auf Vermutungen angewiesen.

@DeddyH Hab ich da etwas übersehen? Da ist doch überhaupt nichts rekursiv. Er bewegt sich nur auf einer "Ebene".

Gruß
K-H

DeddyH 6. Dez 2010 18:25

AW: [.] und [..] NICHT auflisten.
 
Deshalb ja meine Frage ;)

Kieni 7. Dez 2010 09:39

AW: [.] und [..] NICHT auflisten.
 
Guten Morgen alle zusammen...

Diesen "Mischmasch" musste ich ja nur machen, weil Sh_FileCopyMove..... kein Laufwerk kopieren kann...

Habe jetzt auch herrausgefunden, wie ich es umgehen kann.

Ist der Ordner "backup_new" bei Aufruf der Funktion "Sh_FileCopyMove" vorhanden, werden die Ornder richtig kopiert.

Warum? Keine Ahnung... In der Hilfe finde ich dazu leider auch nichts.

Aber interessieren würde es mich trotzdem... :D

Gruß Kieni


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz