C# Streamwriter verschluckt sich

MasterMito

Cadet 3rd Year
Registriert
Mai 2007
Beiträge
54
Hallo Ihr,
habe gerade ein nettes Programm geschrieben das mit den kompletten Verzeichnisnameninhalt der Festplatte in eine Textdatei schreibt.
Nur gegen Ende kommt der Streamwriter ins straucheln und hackt die die letzten 10-15 Dateinamen einfach ab. Hab mir das ganze parallel nochmals auf der Konsole anzeigen lassen und da tauchen die Dateinamen auf die in der Textdatei fehlen.
Das ganze tritt nur bei sehr sehr vielen Dateien auf (>1000). Darunter macht er alles fein.
Liegt der Gehler in C#? Need Help & Thanks
Code:
using System;
using System.IO;

namespace DriveSeek
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			string Path = args[0];
			
			StreamWriter sw = new StreamWriter(args[1]);
			
			RecurseDirs(Path, 0, sw);

		}
		
		static void RecurseDirs (string dir, int depth, StreamWriter sw)
		{
			DirectoryInfo di = new DirectoryInfo (dir);
			DirectoryInfo[] dirs = di.GetDirectories();
			String indentication = new String (' ', depth);
			
			foreach (DirectoryInfo d in dirs)
			{
				sw.WriteLine(indentication +d );
				if( d.Name != "$RECYCLE.BIN" && d.Name != "System Volume Information")
					RecurseDirs(d.FullName, depth+2, sw);				
			}
			
			FileInfo[] files = di.GetFiles();
			
			foreach (FileInfo d in files)
			{
				sw.WriteLine(indentication + d);
			}
		}
	}
}

und PS: Ich kann Programmieren und weiß nun mal wirkich nicht weiter
 
sw.Flush();
sw.Close();

mal nach RecurseDirs(Path, 0, sw) einfügen..

Ach ja, "sw.Flush();" kannst im Grunde auch immer an das Ende von RecurseDirs() setzen, das schreibt halt die Zeichen, die noch im Puffer sind...
 
Heureka...

Merci und gut N8

Jetzt weiß ich das ich das Skript vom Prof endgültig richtung Tone klopfen kann.
 
Weiters solltest du beachten, dass DirectoryInfo("C:") nicht die Dateien vom Laufwerk C auslistet, sondern die vom Standardordner von Laufwerk C. Beim Systemlaufwerk ist das meistens das Userprofil. Du solltest also auf C: oder C:\ abfragen und wenn ja, dann daraus ein C:\.. machen.
Weiters solltest du über das RecurseDir ein try catch stecken, da du wahrscheinlich nicht auf jeden Ordner Leserechte haben wirst. Da kann es mehr als nur den Papierkorb und System Volume Information geben, vor allem wenn man keine lokalen Admin Rechte hat.
Außerdem sollte man jeden Stream schließen, wenn man ihn nicht mehr benötigt. Das wirst du spätestens merken, wenn du die ganze Aktion zweimal hintereinander ausführen willst ohne das Programm neu zu starten.

Mit den Änderungen schneidet er bei mir auch nichts mehr ab. Da braucht man nicht immer Flushen. Das passiert beim Schließen automatisch.
 
Zuletzt bearbeitet:
Zurück
Oben