2009-06-09 8 views
3
using System; 
using System.Collections.Generic; 
using System.IO; 

class Program 
{ 
    static void Main() 
    { 
     // Get all files in Documents 
     List<string> dirs = FileHelper.GetFilesRecursive("S:\\bob.smith\\"); 
     foreach (string p in dirs) 
     { 
      Console.WriteLine(p); 
     } 
     // Write count 
     Console.WriteLine("Count: {0}", dirs.Count); 
     Console.Read(); 
    } 
} 

static class FileHelper 
{ 
    public static List<string> GetFilesRecursive(string b) 
    { 
     // 1. 
     // Store results in the file results list. 
     List<string> result = new List<string>(); 

     // 2. 
     // Store a stack of our directories. 
     Stack<string> stack = new Stack<string>(); 

     // 3. 
     // Add initial directory. 
     stack.Push(b); 

     // 4. 
     // Continue while there are directories to process 
     while (stack.Count > 0) 
     { 
      // A. 
      // Get top directory 
      string dir = stack.Pop(); 

      try 
      { 
       // B 
       // Add all files at this directory to the result List. 
       result.AddRange(Directory.GetFiles(dir, "*.*")); 

       // C 
       // Add all directories at this directory. 
       foreach (string dn in Directory.GetDirectories(dir)) 
       { 
        stack.Push(dn); 
       } 
      } 
      catch 
      { 
       // D 
       // Could not open the directory 
      } 
     } 
     return result; 
     var k = ""; 
     result = k; 
    } 
} 

Ceci est mon code. J'essaye de sérialiser le résultat dans un fichier XML (j'ai pensé en le passant à un var, je pourrais employer cette variable pour sérialiser). Je suis à bout de nerfs. S'il vous plaît quelqu'un d'aide. Bizarrement, pour une raison quelconque, je ne peux pas ajouter de commentaires - en réponse, oui, j'ai passé en revue des tutoriels sans fin sur la sérialisation. Je suis un débutant complet à ce genre de choses et, franchement, ces tutoriels ont été inutiles pour la plus grande partie b/c je ne suis pas capable de mettre cette fonction et sérialisation ensemble. À ce stade, je cherche une solution car je suis sur le point de casser sérieusement quelque chose par frustration.Comment sérialiser?

+0

ce qui est mal avec http://www.google.be/search?q=c%23+serialization&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:nl:official&client=firefox-a? – Stormenet

+0

@Stormenet quoi de mal avec lui poser une question ici sur SO qui est l'un des principaux objectifs de SO. –

+0

"Je pensais en le passant à un var, je pourrais utiliser cette variable pour sérialiser" - woah, je pense que vous avez un malentendu sérieux sur ce que le mot-clé var fait. var est * NOT * un type – dss539

Répondre

3

Si vous voulez simplement sortir le contenu de la liste dirs, il est probablement plus facile en utilisant un XmlWriter:

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 
using (XmlWriter writer = XmlWriter.Create(@"c:\path\filename.xml", settings)) 
{ 
    writer.WriteStartElement("dirs"); 
    dirs.ForEach(d => writer.WriteElementString("dir", d)); 
    writer.WriteEndElement(); // dirs 
} 

Le résultat ressemblera à ceci:

<?xml version="1.0" encoding="utf-16"?> 
<dirs> 
    <dir>c:\</dir> 
    <dir>c:\Program Files</dir> 
    ... 
</dirs> 

Notez que cela peut-être pas être ce que l'on entend généralement par parler de sérialisation dans .NET, puisqu'il ne contient pas d'informations sur le type d'objet contenant les données, donc vous ne pouvez pas utiliser ceci pour désérialiser les données xml dans une liste en utilisant la sérialisation disponible mécanismes dans le fr amework.

Mise à jour

Si vous voulez au lieu de le faire plus « style de cadre », vous pouvez utiliser le BinaryFormatter:

// serialize the object to disk 
BinaryFormatter formatter = new BinaryFormatter(); 
using (Stream stream = File.OpenWrite(@"c:\temp\dirlist.data")) 
{ 
    formatter.Serialize(stream, dirs); 
} 

// at some other point, when you want to deserialize 
BinaryFormatter formatter = new BinaryFormatter(); 
List<string> dirList; 
using (Stream stream = File.OpenRead(@"c:\temp\dirlist.data")) 
{ 
    dirList = (List<string>)formatter.Deserialize(stream); 
} 

Dans ce cas, vous obtiendrez un fichier binaire sur disque n'a pas de sens dans un éditeur de texte (mais il ressemble à quelque chose comme ça, j'ai introduit quelques sauts de ligne pour le rendre plus "lisible"):

ÿÿÿÿ   System.Collections.Generic.List`1[[System.String, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
_items_size_version      c:\ c:\Program Files 
2

Je ne veux pas avoir l'air méchant, mais il semble, d'après votre question, qu'il vous manque des concepts très importants et fondamentaux concernant la sérialisation.

This tutorial peut être un bon point de départ pour la sérialisation. Essayez ceci, et si vous avez des questions, n'hésitez pas à les poster ici sur SO.

Hope this helps,

+1

David, vous pensiez que le tutoriel n'était pas utile, ou que le demandeur ne manquait pas de concepts fondamentaux concernant la sérialisation? Je n'ai jamais l'intention d'être méchant lorsque je fournis des réponses, et pour être honnête, je ne pense pas que ce soit le cas ici. Cependant, à la lumière de vos commentaires, j'ai modifié le libellé de cette réponse. Pouvez-vous me dire si vous pensez toujours que c'est méchant?Si oui, je vais supprimer la réponse. Merci :) –

+0

Basé sur votre édition, maintenant je peux voir vos intentions. J'ai enlevé mon vote négatif. Merci pour la mise à jour. –

1

Sur une note de côté, vous pouvez avez tous les fichiers dans tous les sous-dossiers en utilisant

Directory.GetFiles(@"S:\\bob.smith\\", "*.*", SearchOption.AllDirectories) 
7

Vous pouvez utiliser le XmlSerializer:

using System.Xml.Serialization; 

static void Main() 
    { 
     // Get all files in Documents 
     List<string> dirs = FileHelper.GetFilesRecursive(@"S:\\bob.smith\\"); 

     XmlSerializer x = new XmlSerializer(dirs.GetType()); 
     x.Serialize(Console.Out, dirs); 



     Console.Read(); 
    } 
+0

très belle solution. –

Questions connexes