Entwickler-Ecke

Basistechnologien - Anscheinend Problem mit StreamWriter


mandawar - Mo 30.03.09 10:55
Titel: Anscheinend Problem mit StreamWriter
Hi Leute,
ich habe ein Koncolenprogramm geschrieben, das aus alles Unterordnern eines Root-Ordners alle Ordner und Dateien in eine csv ausgeben soll. Allerdings bricht der Algorithmus in einem Ordner immer ab. Er schreibt die datei, allerdings ohne Endung und ignoriert den Rest einfach.
Ich habe mir das mal im Debugger angeschaut, und komischerweise geht er innerhalb des Programmes alle weiteren Dateien durch, schreibt sie allerdings nicht mehr in die csv. Die Csv hat am Ende um die 700 Zeilen.
Ich weis echt micht woran es liegt...

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Umstellungsverwaltung_1
{
    class Program
    {
        private static FileStream ExcelFileStream;
        private static StreamWriter ExcelStreamWriter;

        static void Main(string[] args)
        {
            Program Umstellungsverwaltung = new Program();
            StringBuilder strRootVerzeichnis = new StringBuilder(@"R:\pa\y52d\src\y");
            if (File.Exists(@"P:\Umstellungsverwaltung.csv"))
            {
                try
                {
                    ExcelFileStream = File.OpenWrite(@"P:\Umstellungsverwaltung.csv");
                }
                catch
                {
                    Console.WriteLine("ES IST EIN FEHLER AUFGETRETEN!");
                    Console.ReadLine();
                    return;
                }
            }
            else
            {
                ExcelFileStream = File.Create(@"P:\Umstellungsverwaltung.csv");                
            }
            ExcelStreamWriter = new StreamWriter(ExcelFileStream);
            ExcelStreamWriter.WriteLine(@"Ordner;Programmname;Status");
            SchreibeInExcel(strRootVerzeichnis.ToString());
        }

        static void SchreibeInExcel(String Ordner)
        {
            Int32 i = new Int32();
            i = 0;
            
            ExcelStreamWriter.WriteLine(Ordner.Substring(14,Ordner.Length-14) + ";;");
            string[] strInhalt = Directory.GetFileSystemEntries(Ordner);
            foreach (string s in strInhalt)
            {
                if (0 != (File.GetAttributes(strInhalt[i]) & FileAttributes.Directory))  //strInhalt[i] is Dir
                {
                    SchreibeInExcel(strInhalt[i].ToString());
                }
                else
                {
                    // strInhalt ist eine Datei
                    FileInfo aktFile = new FileInfo(strInhalt[i]);
                    ExcelStreamWriter.WriteLine(";" + aktFile.Name + ";");
                }
                i++;
            }
        }
    }
}


Weis jmd. von euch woran es liegt, oder braucht ihr noch weitere Infos?

Gruß
Basti


JüTho - Mo 30.03.09 11:34

Hallo,

es wäre vielleicht hilfreich, wenn du den betreffenden Dateinamen angeben würdest (vorausgesetzt natürlich, das Problem tritt immer an derselben Stelle auf): Ist es ein besonderer Name, sind die Lese- und Schreibrechte in diesem Verzeichnis eingeschränkt oder ...?

Mir fallen folgende Punkte auf:

C#-Quelltext
1:
2:
3:
if (0 != (File.GetAttributes(strInhalt[i]) & FileAttributes.Directory))  //strInhalt[i] is Dir
// der Vergleich sollte nach dem Beispiel in der SDK-Doku/MSDN so aussehen:
if ((File.GetAttributes(strInhalt[i]) & FileAttributes.Directory) == FileAttributes.Directory)

FileInfo ist überflüssig; das erzeugt nur kurzfristig ein Objekt. Direkter geht es so:

C#-Quelltext
1:
ExcelStreamWriter.WriteLine(";" + Path.GetFileName(strInhalt[i]) + ";");                    

ToString ist nur dann nötig, wenn das Objekt kein String ist. Hier es überflüssig:

C#-Quelltext
1:
2:
3:
SchreibeInExcel(strInhalt[i].ToString());
//  ersetzen durch:
SchreibeInExcel(strInhalt[i]);

Vielleicht ist auch der ExcelStreamWriter schuld; wie der arbeitet, ist nicht ersichtlich. Eine csv-Datei ist doch eine einfache Textdatei; da würde ich sowieso mit File.AppendAllText arbeiten. Sauberer ist eigentlich sogar noch, alle Teile im Arbeitsspeicher zusammenzutragen (per StringBuilder oder List<string>) und am Schluss insgesamt abzuspeichern.

Übrigens gibt es die Code-Markierung speziell für C#.

Jürgen


mandawar - Di 31.03.09 16:01

Okay, danke, hat geklappt :)
Ich habe jetzt alles in einem StringBuilder gesammelt und dann einfach in eine csv geschrieben, lief super :)