2009-06-17 6 views
1

J'essaie d'ajouter des détails FileInfo à mon fichier XML en analysant et en collectant récursivement les fichiers. Cependant, j'ai un peu de mal et je ne suis pas sûr de savoir comment résoudre ce problème.Surcharge Stack.Push?

Voici mon code:

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; 




    } 

} 

}

Ok où je rencontre une erreur est où je suis en train de prendre la dirInfo.Name.ToString() et les autres lignes de code et en quelque sorte incorporer ceux-ci dans le rendu de mon fichier XML avec ces détails. L'erreur est que Push ne peut pas être surchargé car j'ai essayé:

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

Quelqu'un a des idées? Est-ce que je fais cela en arrière?

Répondre

1

MISE À JOUR Correction d'une erreur

Il suffit d'utiliser un Stack<DirectoryInfo> au lieu d'un 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; 
    } 

} 
+0

ok j'ai essayé cette méthode et j'obtiens une erreur -> Une variable locale nommée 'dirInfo' ne peut pas être déclarée dans cette portée b/c elle donnerait un sens à 'dirInfo' qui est déjà utilisé dans un 'parent ou courant «portée à désigner autre chose. – yeahumok

+0

@yhumhumok: Cela signifie que vous avez déclaré une variable avec le même nom deux fois. Je suppose que vous êtes nouveau à C#? –

+0

très nouveau et je le trouve extrêmement frustrant !!! – yeahumok

4

Je ne suis pas sûr de ce que tout se passe ici ... Tout d'abord, Directory.GetFiles peut déjà obtenir tous les fichiers récursive:

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

GetDirectories peuvent faire la même chose. A en juger par votre code, votre fonction s'appelle GetFiles mais elle reçoit des répertoires à la place? Deuxièmement, pour pousser des informations sur une pile, pourquoi ne pas avoir un Stack<FileInfo> ou Stack<DirectoryInfo>, puis les enlever manuellement en écrivant votre fichier XML, en lisant les informations dont vous avez besoin et en les écrivant en XML?

Editer: Voici un exemple plus simple. Je suppose que vous essayez d'obtenir tous les fichiers d'un répertoire (de façon récursive) et de fournir des informations à leur sujet. Je vais combiner vos deux fonctions ensemble (car un bon GetFiles existe déjà).

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(); 
} 

Après j'ai regardé dans votre code, vous ne l'utilisez que Stack <> pour quoi que ce soit, donc ignorer. Si vous voulez un exemple par rapport à votre code d'origine:

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

Je comprends ce que vous dites sur la récursivité ... mais je ne suis pas la section Stack. Pouvez-vous me montrer de quoi vous parlez? – yeahumok

+0

merci beaucoup! – yeahumok

0

encapsulent les informations que vous essayez de stocker, puis faire la pile de ce qui suit:

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); 
}