DirectoryDump - Ordnerinhalte speichern

DirectoryDump ist ein C#-Konsolenprogramm, welches mit dem dotnet-Framework 1.1 kompiliert ist. Die Unicode-Ausgabedatei dbDoc.txt ist prinzipiell mit der Ausgabe des DOS-Dir identisch, aber bei mehr als einer Extensiondefinition erheblich schneller, da jede Ordnerstruktur nur einmal durchsucht wird.

Die zip-Datei enthält neben der exe-Datei das Klassenobjekt im Quellcode.



Anwendungsgebiet

Das Programm DirectoryDump.exe findet in Stapeldateien (batch) auf FileServern Verwendung, um die vorhandenen Dateien von verschiedenen Anwendergruppen separat zu indizieren, um einen Client-Rechner nicht zu belasten (keine Wartezeit).

Die Ausgabedatei dbDoc.txt kann durch andere Programme weiter verarbeitet werden. Dieses Feature ist gerade dann sinnvoll, wenn die Windows-Suchfunktion im Netzwerk abgeschaltet ist. Wegen der deutschen Umlaute erfolgt die Ausgabe im Unicode-Format.

Die Indizes dienen einem Desktopsuchprogramm, z.B. dbDoc, als sehr schnelle Zugriffsmöglichkeit (300000 Dateinamen in weniger als einer Sekunde) auf die benötigten Daten.

Das Programm dbDoc.exe befindet sich zur Zeit in der Betaphase.



Prämissen

Einsatz als Kommando in Stapeldateien
bestimmte Dateiextensions werden in einem einzigen Aufruf definiert
es werden nur Verzeichnisse ausgegeben, die auch Dateien enthalten
der Name der Ausgabedatei ist nicht konfigurierbar


Format

DirectoryDump.exe Parameter1 Parameter2 Parameter3

In Parameter1 wird immer der jeweilige Ordnername erwartet. Alle Unterverzeichnisse werden ebenfalls durchsucht. Enthält der Ordnername Leerzeichen, ist der Parameter in "Anführungszeichen" asc34 zu setzen.

In Parameter2 kann die Option /init gesetzt werden, um eine vorhandene dbDoc.txt zu löschen. Ist diese Option nicht angegeben, dann werden die neuen Daten an die Ausgabedatei angehängt (append mode) und die Dateierweiterungen stattdessen als Parameter2 definiert.

Im letzten Parameter sind die gewünschten Dateiextensions zu definieren. Die Dateierweiterungen sind einzeln mit Punkt ohne Leerzeichen anzugeben. Eingeleitet wird die Option mit /ext

Beispiele:
DirectoryDump.exe "C:\Programme" /init /ext.doc.xls.txt.htm.ppt.pdf
DirectoryDump.exe "C:\Programme" /ext.exe.mdb.lnk.ora



Beispiel einer dbDoc.txt

 Verzeichnis von f:\_global
02.11.2007  10:37             6.526 Access.cls
06.09.2007  15:56            14.428 ADO.cls
27.10.2006  15:02             2.748 Array.cls
26.07.2006  13:19             4.243 CPU.cls
11.03.2006  21:41               977 Dialog.bas
11.03.2006  21:41            21.516 Dialog.cls
13.08.2006  22:49             5.485 DirSensor.cls
08.01.2008  12:02            13.885 Disk.cls
08.04.2004  14:35               943 Error.bas
01.10.2007  15:04            17.726 File.cls
25.03.2006  12:35             3.633 FileTime.cls
22.07.2005  11:10            14.518 FTP.bas
01.08.2005  16:03            12.646 FTP.cls
07.03.2006  14:00            20.297 Get.cls
01.02.2007  17:47             5.220 GetIP.cls
06.03.2007  10:19            13.911 Grid.cls
22.06.2007  14:28            17.949 HiLite.bas
02.08.2006  13:47             6.597 Interpreter.cls
21.08.2007  10:05            16.044 IP.cls
03.07.2006  17:22             8.166 Krypto.cls
25.01.2008  17:50            16.796 Lesen.cls
07.05.2005  20:10            11.095 Lizenz.cls
13.10.2006  09:55            15.522 MailCDO.cls
13.10.2006  10:24            10.811 MailFile.cls
12.09.2007  11:12            11.174 Move.cls
09.08.2007  12:14            11.076 Network.cls
19.07.2007  17:23             1.388 NetworkUnit.cls
31.03.2000  17:03             1.534 Ontop.bas
23.11.2007  16:39             4.030 Printer.cls
18.10.2007  14:24             3.148 Progress.cls
27.07.2007  14:10            12.853 Prozessliste.cls
22.02.2006  15:54            18.127 Schreiben.cls
12.12.2005  00:04             3.251 Split.cls
01.04.2006  23:48             3.599 SQL.cls
22.08.2007  14:35             1.816 SQLStatement.cls
10.04.2004  21:32             5.435 String.cls
14.02.2007  18:14             4.421 TempInternetFiles.cls
11.11.2005  11:02             3.004 Tray.cls
04.07.2006  16:34             3.589 TreeView.cls
22.02.2006  19:20             6.088 Update.cls
09.04.2007  10:59            24.491 Variable.cls
30.06.2006  15:04             5.175 Watchdog.cls
27.07.2005  20:37             4.610 XML.cls
29.09.2006  16:27             1.919 XMLvar.cls
07.03.2005  20:11            14.580 Zip.bas
23.01.2007  16:28             4.740 Zip.cls
 Verzeichnis von f:\_global\JPEG
13.02.2005  17:03            12.448 DIBSection.cls
09.02.1999  10:46           137.728 IJL10.DLL
13.02.2005  16:06            10.953 IntelJPEGLibrary.bas
23.03.2005  18:57            13.996 Screenshot.cls


Quellcode



// DirectoryDump - Konsolenprogramm zum Auslesen von Ordnerinhalten
// Format: DirectoryDump.exe /init /ext.doc.xls
// dotnet Framework 1.1
using System;
using System.IO;
using System.Collections;

namespace DirectoryDump {
public class DirDumper {
public static void Main(string[] args) {
if (args.GetUpperBound(0) == -1) {
// es wurden keine Parameter übergeben, dann
// den aktuellen Ordner nach allen Dateien durchsuchen
args = ".".Split(new Char [] {' '});
}

// Parameter 1
string sDirectory = args[0];

// Parameter 2; optional
FileMode OpenMode = FileMode.Append; // Standard: Daten an bestehende Datei anhängen
if (args.GetUpperBound(0) > 0) {
if (args[1].ToLower() == "/init")
OpenMode = FileMode.Create; // neue Datei erstellen, ggf. überschreiben
}

// Parameter 2+3: Dateierweiterungen ermitteln; Beispiel: /ext.txt.doc.xls
string sFileExt = ""; // alle Dateien suchen
for (int i = 1; i < 3; i++) {
if (args.GetUpperBound(0) >= i) {
if (args[i].Substring(0, 5).ToLower() == "/ext.") {
sFileExt = args[i].Substring(4).ToLower() + "."; // Punkt am Ende des String anhängen
break;
}
}
}

DirectoryInfo current = new DirectoryInfo("."); // aktuelles Programmverzeichnis
string sFilenameOut = current.FullName + "\\dbDoc.txt"; // Ausgabedateiname
if (sDirectory == ".") {
sDirectory = current.FullName; // falls kein Parameter angegeben wurde
}

try {
FileStream fsout = File.Open(sFilenameOut, OpenMode, FileAccess.Write, FileShare.ReadWrite);
StreamWriter swout = new StreamWriter(fsout, System.Text.Encoding.Unicode); //.UTF8

GetDirectoryInfo(sDirectory, sFileExt, swout);

try {
swout.Flush();
fsout.Flush();
} catch(IOException fe) { Console.WriteLine("Flush: " + fe.Message); }
try {
swout.Close();
fsout.Close();
} catch(IOException fe) { Console.WriteLine("Close: " + fe.Message); }
try {
swout = null;
fsout = null;
} catch(IOException fe) { Console.WriteLine("null: " + fe.Message); }
} catch(IOException fe) { Console.WriteLine("Open: " + fe.Message); }
//Console.WriteLine("Return drücken...");
//Console.Read();
}
// ---- Programmende ----

// rekursive Funktion, Ordner und Dateien sortiert einlesen
private static void GetDirectoryInfo(string sDirectory, string sFileExt, StreamWriter swout) {
SortedList colDir = new SortedList(); // Ordnerliste
SortedList colFile = new SortedList(); // Dateiliste

try {
DirectoryInfo current = new DirectoryInfo(sDirectory);
try {
FileSystemInfo[] content = current.GetFileSystemInfos();

if (sFileExt.Length == 0) {
// alle Dateien suchen
foreach (FileSystemInfo entry in content) {
if (entry is DirectoryInfo)
colDir.Add(entry.Name, entry.FullName);
else
Add2FileList(colFile, entry);
}
} else {
// nur bestimmte Dateien suchen
foreach (FileSystemInfo entry in content) {
if (entry is DirectoryInfo)
colDir.Add(entry.Name, entry.FullName);
else {
int p = entry.Name.IndexOf("."); // jede Datei auf eine gültige Extension prüfen
if (p > -1) {
// diese Datei enthält eine Extension
string sExt = entry.Name.Substring(p).ToLower() + ".";
if (sFileExt.IndexOf(sExt) > -1) { // .ext. suchen
Add2FileList(colFile, entry); // Extension ist gültig
}
}
}
}
}
current = null;
content = null;
} catch(IOException fe) {Console.WriteLine("GetFileSystemInfos: " + fe.Message); }
} catch(IOException fe) { Console.WriteLine("DirectoryInfo: " + fe.Message); }

if (colFile.Count > 0) {
// Dateien sind im Ordner vorhanden, dann auch den Ordnernamen ausgeben
//-Console.WriteLine(strDirectory);
swout.WriteLine(" Verzeichnis von " + sDirectory);
foreach (string sZeile in colFile.Values) {
swout.WriteLine(sZeile);
}
}
colFile = null;

// alle im Ordner enthaltenen Unterverzeichnisse jetzt durchsuchen
foreach (string sPfad in colDir.Values) {
GetDirectoryInfo(sPfad, sFileExt, swout);
}
colDir = null;
}

// vollständige Zeile in sortierte Dateiliste füllen
private static void Add2FileList(SortedList colFile, FileSystemInfo entry) {
FileInfo fi = new FileInfo(entry.FullName);
string[] split = fi.LastWriteTime.ToString().Substring(0, 16).Split(new Char [] {' '});
string sFileSize = fi.Length.ToString("' '#,###,###,###,##0");
colFile.Add(entry.Name, split[0] + " " + split[1] + sFileSize.Substring(sFileSize.Length - 18, 18) + " " + entry.Name);
}
}
}



BackUp & Copy - Verzeichnisse sichern
RenW2d - web to date umbenennen