Alle Dateien im Ordner auflisten samt Unterordner

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

pile

Betreff: Alle Dateien im Ordner auflisten samt Unterordner

BeitragDi, Sep 11, 2007 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich bin gerade dabei ein kleines Programm zu schreiben welches mir eine .txt mit dem Gesamten Inhalt des Ordners und den Inhalt/Inhalten des/der Unterordner/s auflistet. Allerdings soll im Textdokument auch die Ordnerstruktur aufgelistet sein und nicht nur einfach alle Dateien untereinander.

Also ich hab jetzt so angefangen:
Code: [AUSKLAPPEN]

   Verzeichnispfad$ = CurrentDir()
   Verzeichnisvariable = ReadDir(Verzeichnispfad$)
Repeat
   Print Dateipfad$
Until Dateipfad$ = ""
  Print "alle Dateien gefunden"
  Waitkey()

Also so wird erstmal der "Hauptordner" angezeigt
Der Printbefehl steht im Moment noch als "Platzhalter" für die spätere Textdatei.
Ich weiß allerdings nicht wie ich es hinbekomme, dass sich mein Programm automatisch an meine Ordnerstrucktur anpasst, weil sich der inhalt ständig ändert, und wie ich alles am Besten zwischenspeichere.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%
 

phil217

BeitragDi, Sep 11, 2007 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
dazu musst du alle Files durchgehen die sich in deinem Ordner befinden, z.b. so
Code: [AUSKLAPPEN]

Verz=READDIR("C:\")
REPEAT
   Datei$=NEXTFILE$(Verz)
UNTIL Datei = ""


dann prüfst du von jeder datei den typ(ordner/datei) mit FileType(Datei$) und falls es ein Ordner ist öffnest du diesen und gehst ihn auf die selbe Weise durch(kannst du z.b. mit einer rekursiven funktion lösen)
so solltest du alle Dateien, auch die in den Unterordnern finden

MfG
Phil

pile

BeitragDi, Sep 11, 2007 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja sorry, Nextfile hab ich vergessen aus meinem Code zu Kopieren, also bei mir war das schon drinn.
So sieht mein Code aus:
Code: [AUSKLAPPEN]
Verzeichnispfad$ = CurrentDir()
   Verzeichnisvariable = ReadDir(Verzeichnispfad$)
Repeat
   Dateipfad$ = NextFile(Verzeichnisvariable)
   Print Dateipfad$
Until Dateipfad$ = ""
  Print "alle Dateien gefunden"
  Waitkey()
 

Keine Ahnung warum das passiert ist. Also ich weiß schon wie ich einen Ordner durchsuche, wie ich in andere Ordner wechsle und unterscheide ob es eine Datei oder ein Verzeichniss ist. Mir ging es eher darum, wie ich das ganze jetzt am effektivsten zwischenspeichere, damit dann am Ende die Textdatei erstellt werden kann.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Smily

BeitragDi, Sep 11, 2007 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst eine Rekursive Funktion verwenden. Also eine Funktion, die sich selbst wieder aufruft.

Code: [AUSKLAPPEN]
Dateiliste("C:")
Function Dateiliste(d$)
   dir = ReadDir(d$)
   Repeat
      file$ = NextFile(dir)
      If Replace(file$, ".", "") <> ""
         Print d$+"\"+file$
         If FileType(d$ + "\" + file$) = 2 Dateiliste(d$+"\"+file$)
      End if
   Until file$ = ""
   CloseDir dir
End function


gruß,
Smily0412

Edit: mit Filetype kannst du herausfinden, ob ein Pfad eine Datei oder ein Verzeichniss ist (und ob er überhaupt existiert)
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

pile

BeitragDi, Sep 11, 2007 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das ist so ziemlich das was ich suche, aber könntest du die Funktion etwas genauer erklären.? Für mich ist es etwas schwer nachzuvollziehen was da genau passiert.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Smily

BeitragDi, Sep 11, 2007 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm das ist etwas komplizierter und erfordert ein wenig "querdenken" aber ich versuchs gerne:

Code: [AUSKLAPPEN]
Dateiliste("C:") ;Funktion Aufrufen. (Dürfte klar sein ^^)
Function Dateiliste(d$)
   dir = ReadDir(d$) ;Verzeichniss Öffnen
   Repeat ;Alle datein durchgehen
      file$ = NextFile(dir)
      If Replace(file$, ".", "") <> "" ; '', '.' und '..' ausschliessen.
         Print d$+"\"+file$ ;Datei ausgeben
         If FileType(d$ + "\" + file$) = 2 Dateiliste(d$+"\"+file$) ;Wenn die datei ein Ordner ist genau diese Funktion nochmal aufrufen
      End if
   Until file$ = ""
   CloseDir dir ;Verzeichniss schliessen.
End function


Wenn ich damit jetzt einen Ordner öffne kann man sagen die Funktion geht folgendermasen vor:

Ordner "bla" einlesen:

- Datei1.txt
- Datei2.txt
- Datei3.dat
- verzeichniss

hier haben wir ein verzeichniss. Also wird in der Funktion nochmal diegleiche Funktion für das unterverzeichniss aufgerufen. Und da Blitzbasic Prozedual ist wird die Alte funktion solange pausiert, bis der Aktuelle aufruf abgeschlossen wird. Sozusagen wird jetzt direkt "verzeichniss" ausgelesen und dannach einfach wieder im Übergeordneten Ordner weitergemacht. (Es sei denn natürlich "verzeichniss" enthält wiederrum unterordner)

Am Ende könnte das ganze so aussehen:

- Datei1.txt
- Datei2.txt
- Datei3.txt
- Verzeichnis <-- funktion ruft sich selbst mit dem Ordner als Parameter auf. Also:
-- Datei11.txt
-- Datei12.txt
-- Unterverzeichniss
--- Noch eine Datei <-- das wars mit dem unterverzeichniss. also zurück zum übergeordneten.
-- Nächst.datei.dat
-- nocheinedatei.dat <-- und hier endet der Inhalt des ordner verzeichniss.. also zurück zum ganz oben liegenden.
- letzte-datei.txt <-- ende des verzeichnisses. Die funnktion wird beendet.

ich hoffe das war relativ verstädnlich, ich bin nicht gut darrin sowas zu erklären ^^

gruß, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

pile

BeitragDi, Sep 11, 2007 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo vielen Dank Very Happy
Also wenn ich das jetzt richtig verstanden habe macht allein die Zeile
Code: [AUSKLAPPEN]
If FileType(d$ + "\" + file$) = 2 Dateiliste(d$+"\"+file$)[quote]
die Funktion rekursiv.
Na ist doch gar nicht so kompliziert.[/quote]
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

pile

BeitragMi, Sep 12, 2007 7:23
Antworten mit Zitat
Benutzer-Profile anzeigen
So, jetzt hab ich das Ganze auf mein Programm angepasst und bekomm ne saubere Textdatei, mit den Daten die ich haben will. Da bin ich auch schon beim nächsten Problem, ich wollt nur nicht extra n neues Thema aufmachen. Wie kann ich identische Dateien mit einander vergleichen, also ob es auch wirklich die gleichen Daten sind? Am einfachsten wäre ja FileSize, aber das trifft ja nicht immer 100% zu. Ich hab hier auch mal was von MD5 gelesen, aber wie erstelle ich so eine MD5-Summe einer Datei und das aus einer BB.exe herraus?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

BladeRunner

Moderator

BeitragMi, Sep 12, 2007 9:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du nur testen willst ob die Dateien identisch sind:
erst mal Filesize, geht das schief ist schonmal ein großer Teil der Dateien ausgenommen.
Wenn Filesize identisch sein sollte:
öffne Datei A in einem Stream und Datei B in einem anderen. Nun ql:readbyte bei beiden und schauen ob reada = readb, wenn ja weiter bis ql:EoF.
Sollte EoF erreicht werden sind beide Dateien identisch.
Das ganze ist recht lahm, daher sollte man sich überlegen es zu beschleunigen, indem man zB 2 Banks anlegt und erst mal beide Dateien einliesst und die dann vergleicht (vermeiden ständiges hin-und herspringen des Lesekopfes).
Das kann man dann noch insofern ein wenig optimieren in dem man von beiden Dateien nur bestimmte Chunks einliesst, d.h. sie in gleichgroße Tortenstücke schneidet und die nacheinander einliesst.
Vorteil: Weniger Speicherbedarf bei dennoch reduzierter Einlesezeit. Zudem arbeitet es schneller solange die Datei nicht grade nur im letzten Chunk Unterschiede aufweisst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

pile

BeitragMi, Sep 12, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Tipp. Allerdings hat das einen Hacken, die Daten müssen auf dem Rechner vorhanden sein. Ich hab die Daten, die verglichen werden sollen, allerdings auf meinem Webspace. Das heißt die müssten erstmal heruntergeladen werden, und das wollte ich unbedingt vermeiden bzw. ich wollte es so machen das leztentlich nur die Daten die sich unterscheiden heruntergeldaen werden. Daher brauche ich ja die Textdatei (die ich ja jetzt habe). Darin stehen alle Dateien mit Ordnerstruktur. So braucht man nur die Textdatei herunter zu laden und dann ließe es sich mit den lokalen Dateien vergleichen. Allerdings müsste dann zu jeder Datei noch ein eindeutiges Merkmal wie eben die Dateigröße dastehen. Aber wie schon gesagt ist ja die Dateigröße nicht immer zuverlässig.
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Silver_Knee

BeitragDo, Sep 13, 2007 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
dann musst du dir die einzelnen dateien gleichzeitig runterladen also 2 streams erstellen mit verschiedenen localports unddie dann byteweise überprüfen

pile

BeitragDo, Sep 13, 2007 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nach längerem überlegen bin ich warscheinlich auf eine gute Lösung gekommen. Ich erstrelle, wie gesagt, die Textdatei in der alle Dateien aufgelistet sind. Neben den dateien kommt in die jeweilige Zeile noch ein Code(hush?), der die Dateien eindeutig identiviziert. Dieser Code wird so erstellt, dass die gesamte Datei in eine Bank eingelesen wird. Danach werden alle Bytes addiert. Und das ergibt dann den "IDentifizierungs-Code"
Das erstellen dieses Codes sieht so aus:
Code: [AUSKLAPPEN]
file$=ReadFile("client.exe");Datei wird eingelesen

dateigr=FileSize("client.exe");Dateigröße wird ermittelt

bank=CreateBank(dateigr);Bank wird in der Größe der Dateigröße erstellt
ReadBytes bank, file, 0, dateigr;Datei wird in die Bank eingelesen

For t=0 To dateigr
   Wert=Wert+PeekShort (bank, t);Code wird erstellt
Next
CloseFile file;Datei wird geschlossen
FreeBank bank ;Bank wird freigegeben
Print Wert;Code wird angezeigt
WaitKey

Lässt sich das noch optimieren?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Smily

BeitragDo, Sep 13, 2007 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
In diesem Fall wäre es eigentlich schon Praktischer, eine MD5-Checksumme der Datei zu erstellen.

Auf dem Server liegt dann eine Liste mit allen Datein und deren Checksumme. Dein Programm vergleicht die Checksummen miteinandern und wenn sie sich unterscheiden wird geupdatet Wink

(btw ist - rein theoretisch betrachtet - die Checksumme auch nicht zu 100% sicher. mit Einwe wahrscheinlichkeit von etwa
0,000000000000000000000000000000000003% können zwei verschiedne String die gleiche checksumme haben Laughing )
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

pile

BeitragDo, Sep 13, 2007 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, die 0,000000000000000000000000000000000003% kann ich verkraften, dann muss eben mal eine Datei heruntergeldaen werden auch wenns gar nicht nötig ist ^^. Mal abgesehen davon das ich ja schon so etwas wie eine Checksumme habe, wie geht das denn nun mit der MD5? Warum ist das besser und vor allem ist es genauso unkompliziert wie meine Methode?
MfG. Pile
Aktuelles Projekt: Irgendwas in den BlitzEditor eintippen und sehen ob was dabei rauskommt. Fortschritt: ca. 3.141592653589793238%

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group