Mo 19. Jan 2009, 16:30 von DOSferatu
Erste Anmerkung: Ich befürchte, daß dieses Forum mit einer Unterart von C (PHP etc) gemacht wurde, was eigentlich nicht schlimm ist. Ich hoffe nur, daß die Backslashes (\) trotzdem angezeigt werden. In einem DOS-Forum ist so etwas eventuell wichtig...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Erst einmal: Schau Dir mal die Hilfe zum Befehl DIR an!
mit HELP DIR
wenn man
DIR C:\FILES\BLA /s /b
macht, zeigt er alle Files in C:\FILES\BLA mit Unterverzeichnissen an, allerdings mit vollem Pfad. Setzt man hinter diese Zeile noch ein >BEISPIEL.TXT, also
DIR C:\FILES\BLA /s /b >BEISPIEL.TXT
so wird das alles in ein File namens BEISPIEL.TXT geschrieben. Aber - wie schon bemerkt - es wird zu jedem File sein voller Pfad reingeschrieben.
Nun gäbe es eine Möglichkeit: Ich schreibe ein kleines Programm, das nichts anderes tut als jede Zeile dieses Files (also in dem Fall BEISPIEL.TXT) auszulesen und nur das wieder zurückzuschreiben, was in jeder Zeile nach dem \ (Backslash) steht - also den Filenamen ohne den Pfad.
Das wäre die einfachste Methode. Kleiner Nachteil daran ist natürlich, daß auf diese Art Verzeichnisse wie Files aussehen, d.h. auch die Verzeichnisse wären in dieser Liste. Abhilfe schafft das:
DIR C:\FILES\BLA /s /b /a:-d >BEISPIEL.TXT
Da werden dann keine Verzeichnisse (Directories) gelistet. Achja. Wenn man auch Systemdateien, versteckte Dateien und ReadOnly haben will:
DIR C:\FILES\BLA /s /b /a:-d /a:shr >BEISPIEL.TXT
Naja, wie gesagt. Und da könnte man dann immer alles bis zum letzten \ der Zeile abschneiden und hätte seine Files. Achja. Die Option /l bewirkt, daß in Kleinbuchstaben gewandelt wird, falls man's braucht...
Also, das wär erstmal das. Gibt noch n paar mehr Optionen bei DIR. Wie gesagt, mach mal
HELP DIR
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Mir fiel aber noch eine andere ein - die hat viel mehr Möglichkeiten, da müßte aus einem Programm, das eigentlich einen anderen Zweck hatte, den File-Listen-Teil rauskratzen und daraus ein eigenes File-Lister Tool bauen.
Erklärung folgt. Ist etwas länger. Und wenn Dir die obengenannte Variante reicht, brauchst Du diesen komischen Text hier nicht durchlesen.
Also: Ich habe vor einer Weile mal ein Programm angefangen, das genau das macht (und einige andere Dinge). Es ist eigentlich dazu gedacht, Files zwischen verschiedenen Verzeichnissen - genauer gesagt aber zwischen verschiedenen Rechnern - zu synchronisieren. Es gibt so eine Synchronisier-Funktion im NC (Norton Commander) mit Strg+F8. Und man kann es da auch für mehrere Rechner tun (z.B. über Nullmodemkabel). Aber irgendwas daran war mir nicht komfortabel genug, z.B. kann der nur so ca. 1300 Dateien listen und so und man kann die "Auswahl", welche synchronisiert werden sollen und welche nicht, nicht genau genug einstellen. (Außerdem spinnt der manchmal bei manchen Dateinamen-Erweiterungen.) ... Aber egal!
Jedenfalls listet mein Programm alle Files in einem Verzeichnis und sämtlicher seiner Unterverzeichnisse - man kann das auch für mehrere Verzeichnisse tun.
Es funktioniert so, daß man es in einem (menschenlesbaren) Init-File angeben kann, von welchem Verzeichnis aus gelesen werden soll. Man kann auch verschiedene Files "maskieren", d.h. z.B. welche Files gelistet werden sollen und welche nicht. Da kann man die minimale und maximale Größe, das minimale und maximale Filedatum und eben auch Filenamen angeben. Wenn man z.B. schreibt
- A*.BMP werden alle Files NICHT gelistet, die mit A beginnen und BMP als Erweiterung haben.
Schreibt man danach:
+ ABC*.BMP werden aber alle BMP-Files DOCH gelistet, wenn sie mit ABC beginnen.
(Also so, daß man z.B. zuerst größere Mengen ausschließen kann, aber Teilmengen dieser größeren Mengen doch zulassen will. Auf die Art muß man nicht alle, die man NICHT haben will, umständlich ausschließen...)
mit SDIR stellt man ein, von welchem Verzeichnis angefangen eine Liste erstellt werden soll, z.B.:
SDIR C:\SPIELE\ARCADE
Es erstellt dann ein Textfile, das momentan so aussieht:
----snip----
*
C:\SPIELE\ARCADE
\
FILE.BLA
ANDERES.TXT
\SPIEL1
DATA.DAT
SPIEL1.EXE
----snap----
Die Verzeichnisstruktur auf dem Rechner wäre dann so:
C:
.|__ <SPIELE>
....|__ <ARCADE>
.......|__ file.bla
.......|__ anderes.txt
.......|__ <SPIEL1>
............|__ data.dat
............|__ spiel1.exe
Es funktioniert also so, daß man es quasi parsen könnte.
Immer, wenn ein Stern * erscheint, wird in der nächsten Zeile ein neues definiertes "Oberverzeichnis" (also immer wenn man einen neuen SDIR Befehl benutzt hat) genannt. Definiert man nur EIN solches Oberverzeichnis, wird dies eben nur am Anfang genannt. Also Zeile mit Stern, Zeile mit Oberverzeichnis.
ACHTUNG! Damit man das Programm von jedem Punkt aus starten kann, und weil es mehrere solcher SDIR geben können soll, muß man hier im INI-File immer den GANZEN Pfad des Oberverzeichnisses angeben. Ich könnte es aber auch noch so ändern, daß ein SDIR ohne Parameter automatisch den Pfad als Ausgangspfad benutzt, in dem man sich gerade befindet.
Danach kommen die Verzeichnisse und Files. Verzeichnisse werden daran erkannt, daß sie immer mit einem \ eingeleitet werden. Hier ist dann das zuletzt genannte "Oberverzeichnis" DAVOR anzufügen, um den gesamten Verzeichnispfad zu erhalten. Ein einzelner \ bedeutet also, daß hier Files folgen, die direkt im genannten Verzeichnis liegen.
Danach folgen immer die Files, die zu DIESEM Verzeichnis gehören. Wird ein anderes Verzeichnis genannt (also wieder eine Zeile, die mit \ beginnt), so gehören die darauffolgenden Files zu eben DIESEM Verzeichnis.
Beim Parsen würde man so vorgehen, daß man immer zwei Stringvariablen hat, eine, die den Hauptpfad enthält, eine die den Unterpfad enthält. Und bei allen Files kann man ihre genaue Position (ihren Suchpfad) feststellen, indem man Hauptpfad+Unterpfad+Filename benutzt (also die Strings zusammenkettet).
Achtung! Bisher funktioniert das nur für das DOS (8.3) Filesystem. Ich könnte es bei Bedarf so erweitern, daß es, wenn es unter Windows läuft, die "langen" Datei- und Verzeichnisnamen ermittelt - ich habe mir schon mal spezielle Unterprogramme geschrieben, die ich dann nur noch einbauen müßte.
Anmerkung: Das Format des Files, das die File- und Verzeichnisnamen enthält, könnte ich auch noch modifizieren. Ich könnte auch die Verzeichnisnamen weglassen oder verkürzen oder was auch immer. (Da ich ja sowieso die Strings immer habe, kann ich damit anstellen, was ich will.)
Anmerkung: Weil das Programm eigentlich für andere Zwecke gedacht war, speichert es die Filenamen in einem speziellen für Filenamen gedachten gepackten (selbstentwickelten) Format im Speicher - mit mehrfach indirekten Verbindungen etc - und kann daher wahnsinnig viele Files listen.
Anmerkung: Der Sinn dieses Programm besteht darin, daß er die gelisteten Files dann - genau wie der NC - mit dem anderen Rechner synchronisiert, ABER es packt sowohl die Liste als auch später die zu synchronisierenden Files (mit einem externen Packer - einstellbar, welcher) in ein einzelnes Packfile (z.B. SD.ZIP) und schickt das gepackte Ding über die serielle Schnittstelle. Weil die serielle Schnittstelle eben nicht die schnellste ist, erschien es mir sinnvoll, das Ganze zu packen, schicken, entpacken. Man gibt nur zu Anfang im Init-File alles an und der ganze Prozeß läuft automatisch ab, sobald man auf beiden Rechnern das File gestartet hat. (Man muß dazu angeben, welcher Rechner Master und welcher Slave ist...)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SOLLTEST Du also wirklich keine andere Möglichkeit finden (und nur dann!) könnte ich da noch sozusagen eine reduzierte Version dieses Programms schreiben, die nur die entsprechenden Dinge tut, die Du willst (also Files listen).
Frage: Willst Du es in ein Programm einbauen oder brauchst Du es einfach nur als File?