Kleiner Pfad-Scanner

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Kleiner Pfad-Scanner

Beitrag von NicTheQuick »

Einfach zu scannenden Pfad auswählen, Ausgabedatei auswählen und es
wird gescannt. Wenn der Scannvorgang beendet ist, erscheint ein
MessageRequester mit der Anzahl der gefundenen Dateien.

Ich habe damit letztens die Festplatte eines Freundes durchforsten dürfen,
weil die Zeit nicht ausgereicht hatte, selbst alles zu durchforsten. Jetzt
kann ich es im Nachhinein machen.

Erweiterungen und Abänderungen am Code sind erwünscht.
  • Beispiele für Erweiterungen:
  • Linien, die ins leere führen, vorher abbrechen
  • Liste ganz anders abspeichern und dafür einen Explorer schreiben, der
    die gescannte Verzeichnisstruktur in einem TreeGadget wieder darstellt
  • nicht nur Namen speichern, sondern auf Wunsch auf Dateigröße und
    MD5 für späteren Vergleich um Änderungen zu erkennen
  • ...
Sollte jemand Lust haben, derartiges zu basteln, kann ich den Thread auch
ins Projekte-Forum verschieben.

Ein Ausgabebeispiel findet sich unter dem Code.

Code: Alles auswählen

Procedure ScanPath(Path.s, inFile.s, Recursion.l = 0, inFileID.l = 0)
  Protected DirID.l, Name.s, count.l, a.l, Praefix.s
  
  
  If Right(Path, 1) <> "\" : Path + "\" : EndIf
  
  If inFileID = 0
    inFileID = CreateFile(#PB_Any, inFile)
    If inFileID = 0 : ProcedureReturn #False : EndIf
  EndIf
  
  DirID = ExamineDirectory(#PB_Any, Path, "*.*")
  If DirID
    While NextDirectoryEntry(DirID)
      Name = DirectoryEntryName(DirID)
      Select DirectoryEntryType(DirID)
        Case #PB_DirectoryEntry_Directory
          If Name <> "." And Name <> ".."
            Praefix = ""
            For a = 1 To Recursion
              Praefix + "| "
            Next
            WriteStringN(inFileID, Praefix + "|")
            Praefix + "|-- "
            WriteStringN(inFileID, Praefix + "[" + Name + "]")
            count + ScanPath(Path + Name + "\", "", Recursion + 1, inFileID)
          EndIf
        Case #PB_DirectoryEntry_File
          Praefix = ""
          For a = 1 To Recursion
            Praefix + "| "
          Next
          Praefix + "|-- "
          WriteStringN(inFileID, Praefix + Name)
          count + 1
      EndSelect
    Wend
  EndIf
  
  ProcedureReturn count
EndProcedure

Path.s = PathRequester("Verzeichnis auswählen...", "\")
File.s = SaveFileRequester("List-Datei angeben...", "\", "Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
If SelectedFilePattern() = 0
  If LCase(Right(File, 4)) <> ".txt"
    File + ".txt"
  EndIf
EndIf

Files.l = ScanPath(Path, File)

MessageRequester("Fertig", "Es wurden " + Str(Files) + " Dateien gefunden.")
Ausgabebeispiel:

Code: Alles auswählen

|
|-- [DX9]
| |
| |-- [PureLibraries]
| | |-- Joystick
| | |-- Keyboard
| | |-- Mouse
| | |-- Palette
| | |-- Screen
| | |-- Sound
| | |-- Sprite
| | |-- Sprite3D
|
|-- [NT4]
| |
| |-- [PureLibraries]
| | |-- Joystick
| | |-- Keyboard
| | |-- Mouse
| | |-- MultimediaBase
| | |-- Screen
| | |-- Sound
| | |-- Sprite
| | |-- Sprite3D
|
|-- [OpenGL]
| |
| |-- [PureLibraries]
| | |-- Screen
| | |-- Sprite
| | |-- Sprite3D
|
|-- [UserLibThreadSafe]
| |
| |-- [PureLibraries]
| | |-- PBOSL_ExPrinter
| | |-- PBOSL_MSXML3
| | |-- PBOSL_NTService
| | |-- PBOSL_Process
| | |-- PBOSL_RFile
| | |-- PBOSL_ScreenGadgets
| | |-- PBOSL_SQLite3
|
|-- [UserLibUnicode]
| |
| |-- [PureLibraries]
| | |-- Mem
| | |-- PBOSL_RFile
| | |-- PBOSL_ScreenGadgets
| | |-- Pdf
| | |-- PdfDraw
| | |-- PdfMisc
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Das ist mal ne coole Sache...
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo!

Melde mich aus'm Urlaub zurück... Lese schon länger wieder passiv hier mit, aber dieses Topic bringt mich doch dazu, aktiv was zu schreiben...

@ NtQ:
Dein Programm gibt's schon und zwar als Windows-Bordmittel, das weißt du ja? Einfach mal in der EIngabeaufforderung CMD tree eingeben... :allright:
tree listet alle Ordner (und Sub-Ordner) im Stammlaufwerk auf
tree D: listet alle Ordner inLaufwerk D: auf.
tree C:\Programme /f listet alle Ordner mit allen Dateien auf.

Einfach mal schauen, tree /? gibt dir die Infos. Übrigens unterstützt tree den "erweiterten Zeichensatz", also die Linien, die der dann zeichnet sind viel schöner als das normale + | usw.


Fast vergessen: Die Ausgabe kann wie folgt in eine Datei umgeleitet werden:
tree C: /f >C:\Inhalt.txt Speichert die Ausgabe, die sonst auf dem Bildschirm erfolgt in C:\Inhalt.txt

Viel Spaß! :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@AND51:
Klar, der benutzt den tollen DOS-Zeichensatz, mit dem ich früher in
QuickBasic immer die Rahmen gezogen hab. :lol:
Ja, sieht schöner aus, würde aber irgendwann rechts aus dem Bild fallen,
wenn die Verzeichnisstruktur zu breit wird (nicht getestet).

Aber eigentlich geht es ja darum, dass man dieses Progrämmchen ausbauen
und unter einer GUI nutzen kann. :wink:
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@NicTheQuick
Hi, ich habe dein Source getestet.
Die Idee ist gut.
Vorschlag: Kannst du nicht diese Zeichen benutzen?

├Ordner

Sowie auch :: ┌ ┐ ┼ ┴ etc...

und nicht so:
|
|-Ordner
|

Könntest du sowas machen? Sieht besser aus
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten