2009-06-17 5 views
1

私はファイルを再帰的にスキャンして収集することによって、FileInfoの詳細をxmlファイルに追加しようとしています。しかし、私は少し問題があり、私はこの問題を解決する方法がはっきりしていません。ここでStack.Pushのオーバーロード?

は私のコードです:私はdirInfo.Name.ToStringを(取るしようとしている。ここで、iはエラーに遭遇し[OK]をがある

public static class ScanAndSerialize 
{ 
    public static void Serialize() 
    { 
     List<string> dirs = FileHelper.GetFilesRecursive(@"s:\project\"); 


     XmlSerializer SerializeObj = new XmlSerializer(dirs.GetType()); 
     string sDay = DateTime.Now.ToString("MMdd"); 
     string fileName = string.Format(@"s:\project\{0}_file.xml", sDay); 
     TextWriter WriteFileStream = new StreamWriter(fileName); 
     SerializeObj.Serialize(WriteFileStream, dirs); 
     WriteFileStream.Close(); 


    } 
} 

static class FileHelper 
{ 
    public static List<string> GetFilesRecursive(string b) 
    { 
     List<string> result = new List<string>(); 

     Stack<string> stack = new Stack<string>(); 
     stack.Push(b); 

     while (stack.Count > 0) 
     { 
      string dir = stack.Pop(); 

      try 
      { 
       result.AddRange(Directory.GetFiles(dir, "*.*")); 


       foreach (string dn in Directory.GetDirectories(dir)) 
       { 
        DirectoryInfo dirInfo = new DirectoryInfo(@"s:\project\"); 
        dirInfo.Name.ToString(); 
        dirInfo.Attributes.ToString(); 
        dirInfo.CreationTime.ToString(); 
        dirInfo.Exists.ToString(); 
        dirInfo.LastAccessTime.ToString(); 
        dirInfo.LastWriteTime.ToString(); 

        stack.Push(dn);      

       } 


      } 
      catch 
      { 

      } 
     } 
     return result; 




    } 

} 

}

)とコードの他の行と何らかの形でXMLファイルをこれらの詳細でレンダリングすることにそれらを組み込んでいます。エラーは私が試したようにプッシュが過負荷にならないということです:

stack.Push(dn, dirInfo.Name.ToString(), dirInfo.Attributes.ToString().....) 

誰もが考えていますか?私はこれを後ろ向きにしていますか?

答えて

1

UPDATEエラーを修正

だけではなく、Stack<string>

public static class ScanAndSerialize 
{ 
    public static void Serialize() 
    { 
     List<string> dirs = FileHelper.GetFilesRecursive(@"s:\project\"); 
     XmlSerializer SerializeObj = new XmlSerializer(dirs.GetType()); 
     string sDay = DateTime.Now.ToString("MMdd"); 
     string fileName = string.Format(@"s:\project\{0}_file.xml", sDay); 
     TextWriter WriteFileStream = new StreamWriter(fileName); 
     SerializeObj.Serialize(WriteFileStream, dirs); 
     WriteFileStream.Close(); 


    } 
} 

static class FileHelper 
{ 
    public static List<string> GetFilesRecursive(string b) 
    { 
     List<string> result = new List<string>(); 

     var stack = new Stack<DirectoryInfo>(); 
     stack.Push(new DirectoryInfo (b)); 

     while (stack.Count > 0) 
     { 
      var actualDir = stack.Pop(); 
      string dir = actualDir.FullName; 

      try 
      { 
       result.AddRange(Directory.GetFiles(dir, "*.*")); 


       foreach (string dn in Directory.GetDirectories(dir)) 
       { 
        DirectoryInfo dirInfo = new DirectoryInfo(dn); 
        dirInfo.Name.ToString(); 
        dirInfo.Attributes.ToString(); 
        dirInfo.CreationTime.ToString(); 
        dirInfo.Exists.ToString(); 
        dirInfo.LastAccessTime.ToString(); 
        dirInfo.LastWriteTime.ToString(); 

        stack.Push(dirInfo); 

       } 


      } 
      catch 
      { 

      } 
     } 
     return result; 
    } 

} 
Stack<DirectoryInfo>を使用
+0

私はこのメソッドを試してみましたが、エラーが出ます - > 'dirInfo'という名前のローカル変数は、このスコープで宣言できません。b/c 'dirInfo'に意味を与えます。 'スコープは他に何かを示す。 – yeahumok

+0

@yeahumok:つまり、同じ名前の変数を2回宣言したということです。私はあなたがC#の初心者だと思っていますか? –

+0

非常に新しいと私はそれが非常にイライラしていることを発見している! – yeahumok

4

私はすべてが...ここに最初にオフに何が起こっているかわからないんだけど、Directory.GetFilesはすでに、再帰的にすべてのファイルを取得することができます。

Directory.GetFiles(path, "*.*", SearchOptions.AllDirectories); 

GetDirectoriesは同じことを行うことができます。あなたのコードから判断すると、あなたの関数の名前はGetFilesですが、代わりにディレクトリを取得していますか?

情報をスタックにプッシュするには、なぜStack<FileInfo>またはStack<DirectoryInfo>になっていないのですか?XMLファイルを書きながら、必要な情報を読み込んでXMLに書き込む際に、

編集:ここでは簡単な例を示します。私はあなたがディレクトリから(再帰的に)すべてのファイルを取得し、それらに関する情報を出力しようとしていると仮定しています。私はあなたの2つの機能を一緒に組み合わせます(良いGetFilesが既に存在するので)。私はあなたのコードを見た後

using System.Xml; 

public static void WriteXMLForAllFiles(string directory, string outputFilePath) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 

    XmlWriter writer = XmlTextWriter.Create(outputFilePath, settings); 

    writer.WriteStartDocument(); 
    writer.WriteStartElement("Files"); 

    foreach(string file in Directory.GetFiles(directory, "*.*", SearchOptions.AllDirectories)) 
    { 
     FileInfo fileInfo = new FileInfo(file); 
     writer.WriteStartElement("file"); 

     writer.WriteAttributeString("path", file); 
     writer.WriteAttributeString("creationTime", fileInfo.CreationTimeUtc.ToString()); 
     writer.WriteAttributeString("lastWriteTime", fileInfo.LastWriteTimeUtc.ToString()); 

     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
    writer.Close(); 
} 

、あなたは何のためのスタック<>、そうはそれを無視することを使用していません。あなたがあなたの元のコードに関連して例を望んでいた場合:

public static List<FileInfo> GetFilesRecursive(string b) 
{ 
    List<FileInfo> fileList = new List<FileInfo>(); 

    foreach(string file in Directory.GetFiles(directory, "*.*", SearchOptions.AllDirectories)) 
    { 
     fileList.Add(new FileInfo(file)); 
    } 

    return fileList; 
} 
+0

私は再帰についてあなたが言っていることを理解しています...しかし、私はスタックセクションに従っていません。あなたが話していることを私に見せてもらえますか? – yeahumok

+0

ありがとうございます! – yeahumok

0

はあなたが保存しようとしている情報をカプセル化し、その外のスタックを作る:

public class TraversalData { 
    // All the info you'd like to keep track of. 
    public string Name; 
    public string Attributes; 
    // ... 
} 

Stack<TraversalData> data = ... 

// ... 

foreach (string dn in Directory.GetDirectories(dir)) { 
    // Make a TraversalData out of the information you want to store. 
    TraversalData td = // ... 

    data.Push(td); 
} 
関連する問題