Warum werden unter Windows zusätzliche "Ordner" gefunden

Benutzeravatar
photor
Beiträge: 507
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von photor »

Hallo Forum,

Ich programmiere unter Linux und auch Windows. Häufig probiere ich (auf dem Heim-Laptop) unter Linux etwas aus, das dann unter Windows im Büro laufen soll. Jetzt bin ich auf etwas gestoßen, was ich mir nicht erklären kann und für das ich Hilfe brauche.

Ich will Daten verarbeiten, die in ASCII-Dateien gesammelt werden und die jeweils in eigenen Ordnern (zu sog. Loadcases) zusammengefasst werden. Um davon mehrere quasi als Batch zu verarbeiten kommen diese wiederum in einen übergeordnetten Data-Ordner.

Ich lese nun alle Ordner (d.h. zunächst die Namen) dieses Data-Folders ein /gespeichert in einer TStringList. Das geschieht mit der folgenden Routine:

Code: Alles auswählen

 if SelectDirectoryDialog1.Execute then
  begin
    LoadcasesDirs := TStringList.Create;

    try
      MasterDir := IncludeTrailingPathDelimiter(SelectDirectoryDialog1.Files[0]);

      BatchJobFrm.MasterDirEdt.Text := MasterDir;

      LoadcasesDirs := FindAllDirectories(MasterDir,False,PathDelim);

      Logger.LogMsg(llDebug,Format('   ----- %d loadcases/directories found',
        [LoadcasesDirs.Count]));

      BatchJobFrm.FillList(LoadcasesDirs);

    finally
      LoadcasesDirs.Free;
    end;

  end;
Und das funktioniert auch: die Einträge der StringList wird dann weiter verarbeitet.

D.h. genau genommen funktioniert es unter Linux hervorragend. Beim Transfer auf meinen Windows-11-Rechner im Büro sehe ich in der StringList auf einmal die zusätzlichen Ordner/Einträge:
  • $RECYCLE.BIN
  • KRo-Projects (das ist der Basis-Ordner auf Laufwerk D:, in dem sich die Lazarus-Projekte befinden)
  • System Volume Information

Die sind definitiv nicht im Data-Verzeichnis vorhanden (zumindest werden sie mir nicht im Explorer oder Total-Commander angezeigt).

Das Windows 11 ist ganz frisch; das gilt fpr den rechner als auch für mich (unter Windows 10 war mir das nicht aufgefallen).

Weiß hier jemand, woran dieses Verhalten liegt (eventuell am FindAllDirectories) und wie kann ich das am geschicktesten verhindern. Wie gesagt, unter Linux tut alles, wie es soll.

Dankbar für jede Anregung,
Photor

Joh
Lazarusforum e. V.
Beiträge: 280
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Joh »

photor hat geschrieben: Fr 4. Apr 2025, 20:22
  • $RECYCLE.BIN
  • System Volume Information

werden auf jedem Laufwerk von Microsoft erstellt.
Diese haben aber die Attribute
- Hidden
und
- System

diese scheint FindAllDirectories zu ignorieren.
Da das feste Verzeichnisnamen sind: entweder ausblenden oder direkt auf dein Datenverzeichnis zugreifen.
just my two Beer

Benutzeravatar
photor
Beiträge: 507
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von photor »

Joh hat geschrieben: Fr 4. Apr 2025, 20:56
photor hat geschrieben: Fr 4. Apr 2025, 20:22
  • $RECYCLE.BIN
  • System Volume Information

werden auf jedem Laufwerk von Microsoft erstellt.
Diese haben aber die Attribute
- Hidden
und
- System

diese scheint FindAllDirectories zu ignorieren.
Da das feste Verzeichnisnamen sind: entweder ausblenden oder direkt auf dein Datenverzeichnis zugreifen.
Hallo Joh,

so etwas in der Art hatte ich mir gedacht. Aber offensichtlich werden die sogar in jedes Verzeichnis eingeblendet (denn ich befinde mich nicht im Verzeichnis/Root-Verzeichnis sondern tiefer). Der Zugriff erfolgt ja direkt auf das "Data"-Directory. :shock:

Ich werde mich mal auf die Suche machen, ob und wie man solche Verzeichnisse bzw. Dateien bei FindAllDirectories ausblenden kann.

Aber ja. an "manuelles ausblenden" hatte ich auch schon gedacht. Ist aber Holzhammer, nicht sehr elegant und fehleranfällig. :roll:

Ciao,
Photor

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 359
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Jorg3000 »

Moin!

Ich habe folgende Procedure genutzt, um die Ordnernamen zu lesen. Ich kann mich an versteckte Ordner nicht erinnern - hab's aber gerade nicht getestet.
Evtl. musst du bei sl.Add den Pfad ergänzen durch sl.Add(Path+sr.Name);

Code: Alles auswählen

procedure getSubfolderNames(const Path: String; sl: TStringList);   // listet Unterverzeichnisse, nur 1 Ebene
var sr: TSearchRec;
begin
  sr:=Default(TSearchRec);
  if SysUtils.FindFirst(Path+'*.*',$10,sr)<>0 then Exit;
  Repeat
    if (sr.Attr AND $10<>0) and (sr.Name<>'.') and (sr.Name<>'..') then sl.Add(sr.Name);
  Until SysUtils.FindNext(sr)<>0;
  SysUtils.FindClose(sr);
end;

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von theo »

FindAllDirectories ist ja eine convenience Funktion, die nicht alle Optionen beinhaltet.
Geh mal einen Schritt tiefer und schau was die macht.
Vielleicht geht es so? Ausprobieren! (Bin nicht auf Windows)

Code: Alles auswählen

procedure FindAllDirectoriesEx(AList: TStrings; const SearchPath: String;
  SearchSubDirs: Boolean; PathSeparator: char);
var
  Searcher :TFileSearcher;
begin
  Assert(AList <> nil);
  Searcher := TListDirectoriesSearcher.Create(AList);
  Searcher.PathSeparator := PathSeparator;
  Searcher.FileAttribute:=faDirectory {or faHidden or faSysFile}; //--- NEU
  try
    Searcher.Search(SearchPath, AllFilesMask, SearchSubDirs);
  finally
    Searcher.Free;
  end;
end;  

wp_xyz
Beiträge: 5129
Registriert: Fr 8. Apr 2011, 09:01

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von wp_xyz »

Ich verstehe nicht: Wenn ich das folgende Programm laufen lasse (auch Windows 11), werden im Memo nur Verzeichnisse angezeigt, die mit "c:\Windows" beginnen, SystemVolumeInformation und der RecycleBin werden NICHT angezeigt; diese kommen nur, wenn ich das Rootverzeichnis (c:\ oder d:\) in FindAllDirectories eintrage.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  FindAllDirectories(Memo1.Lines, 'c:\windows', false);
//  FindAllDirectories(Memo1.Lines, 'c:\', false);
end; 

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Mathias »

D.h. genau genommen funktioniert es unter Linux hervorragend. Beim Transfer auf meinen Windows-11-Rechner im Büro sehe ich in der StringList auf einmal die zusätzlichen Ordner/Einträge:
$RECYCLE.BIN
KRo-Projects (das ist der Basis-Ordner auf Laufwerk D:, in dem sich die Lazarus-Projekte befinden)
System Volume Information
Wen ich mich nicht täusche, ist dies schon seit Windows NT 4 so.
Auf meiner NAS sehe ich auch eine "System Volume Information" da habe ich wohl mit Windows zugegriffen.
Ich verstehe nicht: Wenn ich das folgende Programm laufen lasse (auch Windows 11), werden im Memo nur Verzeichnisse angezeigt, die mit "c:\Windows" beginnen, SystemVolumeInformation und der RecycleBin werden NICHT angezeigt; diese kommen nur, wenn ich das Rootverzeichnis (c:\ oder d:\) in FindAllDirectories eintrage.
Dies ist sicher schon seit Windows NT4 so, dies wird bewusst gemacht, das ein normaler User nichts zerstören kann.
Auch findet man sonst komische Sachen, wie mit "Programm Files", "Eigene Dateien", etc.
Da ist Linux sauberer aufgebaut.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
photor
Beiträge: 507
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von photor »

theo hat geschrieben: Sa 5. Apr 2025, 10:46 FindAllDirectories ist ja eine convenience Funktion, die nicht alle Optionen beinhaltet.
Geh mal einen Schritt tiefer und schau was die macht.
Vielleicht geht es so? Ausprobieren! (Bin nicht auf Windows)

Code: Alles auswählen

procedure FindAllDirectoriesEx(AList: TStrings; const SearchPath: String;
  SearchSubDirs: Boolean; PathSeparator: char);
var
  Searcher :TFileSearcher;
begin
  Assert(AList <> nil);
  Searcher := TListDirectoriesSearcher.Create(AList);
  Searcher.PathSeparator := PathSeparator;
  Searcher.FileAttribute:=faDirectory {or faHidden or faSysFile}; //--- NEU
  try
    Searcher.Search(SearchPath, AllFilesMask, SearchSubDirs);
  finally
    Searcher.Free;
  end;
end;  
Das habe ich heute mal probiert. Ergebnis: die Einträge für
  • $RECYCLE.BIN
  • System Volume Information
sind dann tatsächlich nicht mehr enthalten.

Der Eintrag für "KRo-Projects", der vollständig "D:\KRo-Projects" heißt, wird immer noch so - also mit Drive-Buchstaben - gefunden (war vorher weggefilter, Schuss in's eigene Knie). Seltsam, ich verstehe es nicht.

Dieser Rechner hat ein Windows-11 und Lazarus ist Version 3.8.

Ich habe auch noch mal den Windows-10-Rechner probiert (dort aber mit Lazarus 3.2): dort werden mit der gleichen Prozedur noch viel mehr Einträge gelistet. Ich bin sehr verwirrt. Was wird da eigentlich zurückgeliefert? Oder wie genau bekomme ich NUR die Verzeichnisse, die in einem Verzeichnis liegen?

Es fehlt mir so langsam auch ein loses Ende an dem ich ziehen könnte. (auf einen einzelnen Eintrag könnte man ja noch explizit wegfiltern).

Ratlos,
Photor


PS: Linux, ich will nur noch Linux. SCNR

PascalDragon
Beiträge: 945
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von PascalDragon »

photor hat geschrieben: Mo 7. Apr 2025, 15:48 Ich habe auch noch mal den Windows-10-Rechner probiert (dort aber mit Lazarus 3.2): dort werden mit der gleichen Prozedur noch viel mehr Einträge gelistet. Ich bin sehr verwirrt. Was wird da eigentlich zurückgeliefert? Oder wie genau bekomme ich NUR die Verzeichnisse, die in einem Verzeichnis liegen?
Wenn die mit angezeigt werden, dann legen sie eben auch da. Das ist einerseits eben einfach NTFS oder Windows Spezialitäten, die Windows sogar auf FAT anlegt (ähnlich wie macOS verschiedene Ordner auf sämtlichen Medien anlegt, die ihm untergeschoben werden). Unter Linux existieren die Dateien, die mit Punkt beginnen, schließlich auch und werden aktiv rausgefiltert.
FPC Compiler Entwickler

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 581
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.9 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Niesi »

photor hat geschrieben: Mo 7. Apr 2025, 15:48
...

Oder wie genau bekomme ich NUR die Verzeichnisse, die in einem Verzeichnis liegen?

...
Lass Dir doch im Dateimanager (oder Explorer, wie das im Windows heißt) auch die "geschützten Systemdateien" und die "versteckten Dateien und Ordner" anzeigen, dann wirst Du sehen, was da alles rumliegt ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
photor
Beiträge: 507
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von photor »

Hallo Forum,

habe heute mal etwas Zeit (im Büro) gefunden und mich mal etwas tiefer mit dem ganzen beschäftigt. Ein bisschen gesucht und hier http://www.devsuperpage.com/Articles/vi ... 1-1691.asp folgendes gefunden (und marginal modifiziert):

Code: Alles auswählen

procedure EnumFolders(root: string; folders: TStrings; PathSeparator: char);

  procedure Enum(dir: string);
  var
    SR: TSearchRec;
    ret: Integer;
  begin
    if dir[length(dir)] <> PathSeparator then
      dir := dir + PathSeparator;

    ret := FindFirst(dir + '*.*', faDirectory, SR);
    if ret = 0 then
      try
        repeat
          if ((SR.Attr and faDirectory) <> 0) and
              (SR.Name <> '.') and
              (SR.Name <> '..') then
          begin
            folders.add(dir + SR.Name);
            Enum(dir + SR.Name);
          end;
          ret := FindNext(SR);
        until ret <> 0;
      finally
        FindClose(SR)
      end;
  end;

begin
  Folders.Clear;
  if root <> emptyStr then
    Enum(root);
end;  
Dieser Code funktioniert auf Win11 wie auch auf Win10; es werden nur die Verzeichnisse angezeigt, die dort liegen sollten. Nicht elegant aber funktioniert.

Um diesen Code auch auf Linux einsetzen zu können, müsste die Suchmaske *.* durch * ersetzt werden. Das könnte man durch ein

Code: Alles auswählen

{$if defined(WINDOWS)}
...
{$else$}
...
{$endif}
Konstrukt definieren. Das gleiche könnte man aber auch beim Aufruf der Funktionen je nach Betriebssystem/Plattform machen.

Lösung gefunden und hier dokumentiert. Alles gut.

Ciao,
Photor

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 359
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Jorg3000 »

Das sieht mir so aus wie das, was ich vor 3 Tagen schon gepostet hatte :lol:

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 359
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Jorg3000 »

photor hat geschrieben: Di 8. Apr 2025, 16:10 Um diesen Code auch auf Linux einsetzen zu können, müsste die Suchmaske *.* durch * ersetzt werden.
Ich habe es gerade unter Windows 10 ausprobiert: Man kann auch unter Windows einfach "*" als Suchmaske verwenden, wenn man alle Ordner (faDirectory) oder alle Dateien (faAnyFile) erhalten möchte.
Die Compiler-Weiche kann man sich also sparen, wenn man grundsätzlich "*" als Maske nimmt.
Das wusste ich aber bis jetzt auch noch nicht, d.h. in meinen Programmen für Windows habe ich bisher immer "*.*" benutzt.

Umgekehrt gefragt: Muss es für Linux zwingend "*" heißen und funktioniert "*.*" unter Linux nicht?

Sieben
Beiträge: 289
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von Sieben »

Gibt auch die Konstante AllFilesMask - Unit System - die einem Compiler-Direktiven erspart.

Benutzeravatar
photor
Beiträge: 507
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Warum werden unter Windows zusätzliche "Ordner" gefunden

Beitrag von photor »

Jorg3000 hat geschrieben: Di 8. Apr 2025, 16:12 Das sieht mir so aus wie das, was ich vor 3 Tagen schon gepostet hatte :lol:
Ja. Hast du wohl Recht. War mir (mangels Wissen und Zeit und so) aber zu unelegant (ist es immer noch; anderes Thema).
Jorg3000 hat geschrieben: Di 8. Apr 2025, 18:04 Umgekehrt gefragt: Muss es für Linux zwingend "*" heißen und funktioniert "*.*" unter Linux nicht?
Also dorum getestet: mit "*.*" bekomme ich unter Linux eine leere Liste zurück (ist ja auch klar; es gibt keine Ordner mit einem "." im Namen; und eine RegExp ist es ja nicht).
Jorg3000 hat geschrieben: Di 8. Apr 2025, 18:04 Ich habe es gerade unter Windows 10 ausprobiert: Man kann auch unter Windows einfach "*" als Suchmaske verwenden, wenn man alle Ordner (faDirectory) oder alle Dateien (faAnyFile) erhalten möchte.
Die Compiler-Weiche kann man sich also sparen, wenn man grundsätzlich "*" als Maske nimmt.
Das wusste ich aber bis jetzt auch noch nicht, d.h. in meinen Programmen für Windows habe ich bisher immer "*.*" benutzt.

Umgekehrt gefragt: Muss es für Linux zwingend "*" heißen und funktioniert "*.*" unter Linux nicht?
Das kann ich nochmal probieren.

Aber natürlich hier schonmal Dank an alle, die hier beigetragen und so geholfen haben.

Ciao,
Photor

Antworten