Alle Dateien im Ordner auflisten samt Unterordner
Übersicht

![]() |
pileBetreff: Alle Dateien im Ordner auflisten samt Unterordner |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo vielen Dank ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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% |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann musst du dir die einzelnen dateien gleichzeitig runterladen also 2 streams erstellen mit verschiedenen localports unddie dann byteweise überprüfen | ||
![]() |
pile |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() (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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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% |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group