Ordnerinhalt inkl Unterordner in eine Text Datei speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von ts-soft »

Mit Threads hab ich kaum Plan da bräucht ich Hilfe.
Tut mit leid, aber Code ohne EnableExplicit rühre ich nicht an <)

Bei Deinem Progress wirste auch ein Problem bekommen, weil Du kennst den FileSize (100%) der rekursiven Dateien erst
nachdem Du diese ermittelt hast, also zu spät für regulären Progress.

PS: Ich würde die Ergebnisse des rekursiven Ermittelns in eine LinkListe zwischenspeichern, statt in einer Textdatei zu verknüpfen,
aber vielleicht sehe ich den Zweck Deines Programmes auch nicht so richtig.

Wenig hilfreich, aber trotzdem "Frohe Feiertage"
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von udg »

Diese progressbar ist nicht wichtig und natürlich hast du recht. Ich kenne den Inhalt eines Ordners vorher nicht. Man müsste also vorher die Dateien zählen.
Lass ich weg.

Der Sinn des tool ist einfach nur:
Starten, Ordner wählen, dessen Inhalt wird mit kompletter Pfad Angabe in eine Text Datei gespeichert.
Fertig. Über Sinn und Unsinn müssen wir dabei nicht reden. Der eine brauchts der andere nicht.

Zu enable explicit :
Das versuche ich jedes mal einzutragen. Und jedes mal funktioniert das bei mir nicht. Ich definiere alles was EE von mir verlangt. Deklariere, und dann bekomme ich trotzdem die Meldung. Ich soll doch bitte mal deklarieren
Ab diesem Punkt klammer ich dann immer EE aus. Warum ich nichts deklariert und definiert bekomme, kein Plan.

Da muss ich noch schauen.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von ts-soft »

EnableExplicit ist eigentlich ganz einfach:

Code: Alles auswählen

EnableExplicit

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Button_Start
  #String_Path
  #Button_Ordner
  #CheckBox_srt
  #CheckBox_jpg
  #CheckBox_bmp
  #CheckBox_mp3
  #LineTopEdFrame
  #LineLeftEdFrame
  #LineRightEdFrame
  #LineBottomEdFrame
  #Gadget_LineLeftEdFrame
  #Gadget_LineRightEdFrame
  #Gadget_LineBottomEdFrame
  #Gadget_LineTopEdFrame
  #Frame_Text
  #Frame3D
  #CheckBox_Custom
  #String_Custom
  #Inhalt_txt
  #Container_CheckboxenUSW
  #Header
  #Exit_btn
  #Gadget_exit
  #CheckBox_srt_Text
  #CheckBox_jpg_Text
  #CheckBox_bmp_Text
  #CheckBox_mp3_Text
  #Img_Fat_Line
  #Fat_Line
  #Triangle
  #Gadget_Triangle
  #Img_Footer
  #Footer
  #Triangle_Button
  #Gadget_Triangle_Button
  #LineTop
  #LineLeft
  #LineRight
  #LineBottom
  #Gadget_LineTop
  #Gadget_LineLeft
  #Gadget_LineRight
  #Gadget_LineBottom
EndEnumeration

Global Path$
Global File2$
Define.l Event, EventWindow, EventGadget, EventType, EventMenu

;TEXT VERTICAL ALIGN IN EINGABEFELD
Procedure StringGadgetVCenter(GadgetID)
   Protected hwndEdit = GadgetID(GadgetID)
   Protected LineCount = SendMessage_(hwndEdit,#EM_GETLINECOUNT, 0, 0)
   Protected hdc = GetDC_(hwndEdit)
   Protected fsz.SIZE
   Protected eRect.RECT
   
   SelectObject_(hdc,GetGadgetFont(GadgetID))
   GetTextExtentPoint32_(hdc,"ABC",3,fsz.SIZE)
   ReleaseDC_(hwndEdit,hdc)   
   
   GetClientRect_(hwndEdit,eRect.RECT)
   eRect\top = (GadgetHeight(GadgetID) - fsz\cy * LineCount) / 2
   eRect\bottom = eRect\top + (fsz\cy * LineCount) + 4
   
   If eRect\bottom < GadgetHeight(GadgetID)
      SendMessage_(hwndEdit,#EM_SETRECT,0,eRect)
   EndIf
EndProcedure

Procedure Examine(Directory$)
  Protected Any=ExamineDirectory(#PB_Any, Directory$, "*.*")
  Protected NewDir$, File$
  
  If Any
    While NextDirectoryEntry(Any)
      If DirectoryEntryType(Any) = #PB_DirectoryEntry_Directory
        NewDir$=DirectoryEntryName(Any)
        If NewDir$ <> "." And NewDir$ <> ".."
          Examine(Directory$+NewDir$+"\")
        EndIf
      Else
        File$=Directory$+DirectoryEntryName(Any)
;         If FileSize(File$)=0
;           Hash=1
;         
;           
;         EndIf
        File2$+File$+" "+#CRLF$
      EndIf
    Wend
    FinishDirectory(Any)
  EndIf
EndProcedure

; usw.
Wie Dein Code im endeffekt aussieht, sollte mir ja egal sein, aber sobald ich den Code abändere, muß ich auf EnableExplicit
bei meinen Variablen verzichten, bzw. bei Deine Hinfügen, ansonsten ist mir das zu Fehlerträchtig. Außerdem sieht man,
wenn es den Ordentlich gemacht wird, gleich den Scope der Variablen, ansonsten müßte man erst den Ganzen Code bis vorne
durchsehen, was bei Fremdcode nicht so viel Spaß macht :mrgreen:

Die Arbeit mache ich mir aber nicht mehr.

PS: Compiler / Syntax-Uberprüfung gibt doch alle Variablen aus, wenn Du eine vergessen haben solltest!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von udg »

ts-soft hat geschrieben:EnableExplicit ist eigentlich ganz einfach:
... ansonsten müßte man erst den Ganzen Code bis vorne
durchsehen, was bei Fremdcode nicht so viel Spaß macht :mrgreen:
Die Arbeit mache ich mir aber nicht mehr.
PS: Compiler / Syntax-Uberprüfung gibt doch alle Variablen aus, wenn Du eine vergessen haben solltest!
EnableExplicit hab ich nun hinzugefügt.

Noch 1 Wehwechen:

wo ich noch einen Programmabsturz habe, wenn ich keinen Ordner zum auslesen mit dem zugehörigen Button aussuche und gleich auf den Button "Start" drücke, öffnet es den SaveFileRequester, ich drück "ok" und dann stürzt das Programm ab.

Wie kann ich das verhindern, dass ich hier zb eine Meldung einblende in einem Gadget:
"Bitte zuerst einen Ordner zum auslesen wählen" falls einer gleich den Start button drückt?

:?

Grüße
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
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

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von NicTheQuick »

Du kannst den Start-Button auch mit DisableGadget erstmal deaktivieren und aktivieren, wenn ein Ordner ausgewählt wurde.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von udg »

Danke, einfache und beste Idee. So mach ich es.

Edit
kann ich so leider nicht machen. DisableGadget verhunzt mir in diesem Fall das Design des Buttons.
Muss ich mir noch was einfallen lassen.
Zuletzt geändert von udg am 27.12.2016 15:57, insgesamt 1-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von Micha122 »

Du möchtest die Tipps zu Eventschleife und Threaded offensichtlich nicht umsetzen. >_<
Benutze einfach mal ein Verzeichnis mit wirklich vielen Dateien.......Fenster wird nicht mehr neu gezeichnet......Fenster reagiert nicht mehr. :allright:

Thema ist ja eigentlich: Ordnerinhalt inkl Unterordner in eine Text Datei speichern

Die Funktion Examine(Directory$) bezieht aber (vorausgesetzt ich habe deinen Code richtig gelesen) gar keine Unterverzeichnisse mit ein. :oops:


Grüße, Micha
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von man-in-black »

Die Funktion Examine(Directory$) bezieht aber (vorausgesetzt ich habe deinen Code richtig gelesen) gar keine Unterverzeichnisse mit ein.
falsch gelesen ;) Examine ruft sich selbst nochmal auf, wenn ein Ordner gefunden wurde. Ordner>Unterordner>Unterordner>... .
Das schöne an der Rekursion ist ja gerade, dass man durch diesen Trick des Selbstaufrufens unendlich tief gehen kann.

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von Micha122 »

Ja, stimmt. Ich habe die Funktion Standalone getestet und den Backslash am ende von directory$ vergessen. :oops:

Funktioniert :allright:

Code: Alles auswählen

Procedure Examine(Directory$)
  Define.i Any, NewDir$, File$
  
  Any=ExamineDirectory(#PB_Any, Directory$, "*.*") 
  If Any 
    While NextDirectoryEntry(Any)
      If DirectoryEntryType(Any) = #PB_DirectoryEntry_Directory
        NewDir$=DirectoryEntryName(Any)
        If NewDir$ <> "." And NewDir$ <> ".."
          Examine(Directory$+NewDir$+"\")
        EndIf 
      Else
        File$=Directory$+DirectoryEntryName(Any)
;         If FileSize(File$)=0
;           Hash=1
;         
;           
;         EndIf
        File2$+File$+" "+#CRLF$
      EndIf
    Wend
    FinishDirectory(Any)
  EndIf
  Debug File2$
EndProcedure


Examine("C:\Users\Micha\Desktop\")

Den Fehler in meiner eigenen Rekursion habe ich nun auch endlich gefunden. Ein falsches behandeln der Pseudo Verzeichnisse.

Grüße
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Ordnerinhalt inkl Unterordner in eine Text Datei speiche

Beitrag von Sicro »

man-in-black hat geschrieben:
Das schöne an der Rekursion ist ja gerade, dass man durch diesen Trick des Selbstaufrufens unendlich tief gehen kann.
Zumindest bis der Stack voll gelaufen ist.
Ich bin mir nicht sicher, ob das bereits bei der maximalen Verzeichnistiefe passieren kann...

Müsste man mal ausprobieren, ob Endrekursion bei PB auch funktioniert:
https://www.heise.de/developer/artikel/ ... kelseite=4
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten