2010-10-13 8 views
11

En supposant que je m'intéresse uniquement aux fichiers texte, quels sont les avantages ou inconvénients spécifiques des méthodes System.IO.File par rapport à StreamWriter?C# I/O - Différence entre System.IO.File et StreamWriter/StreamReader

Y a-t-il des facteurs de performance impliqués? Quelle est la différence fondamentale et laquelle devrait être utilisée dans quels cas?

Encore une question, si je veux lire le contenu d'un fichier dans une chaîne et exécuter une requête LINQ dessus, ce qui est le meilleur?

+0

Le fichier et StreamWriter/Reader sont * à peine * analogues. Pouvez-vous être plus précis, comme Aliostad l'a demandé, et stipuler * quelles * méthodes sur 'File' vous comparez? –

Répondre

2

De quelle méthode parlez-vous?

WriteAllLines() et WriteAllText utilise par exemple StreamWriter derrière la scène. est ici la sortie du réflecteur:

public static void WriteAllLines(string path, string[] contents, Encoding encoding) 
{ 
if (contents == null) 
    { 
     throw new ArgumentNullException("contents"); 
    } 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     foreach (string str in contents) 
     { 
      writer.WriteLine(str); 
     } 
    } 
} 


public static void WriteAllText(string path, string contents, Encoding encoding) 
{ 
    using (StreamWriter writer = new StreamWriter(path, false, encoding)) 
    { 
     writer.Write(contents); 
    } 
} 
4

En général, je partirais avec System.IO.File plus StreamReader que le premier est la plupart du temps un emballage pratique pour ce dernier. considérez le code derrière File.OpenText:

public static StreamReader OpenText(string path) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path"); 
    } 
    return new StreamReader(path); 
} 

Ou File.ReadAllLines:

private static string[] InternalReadAllLines(string path, Encoding encoding) 
{ 
    List<string> list = new List<string>(); 
    using (StreamReader reader = new StreamReader(path, encoding)) 
    { 
     string str; 
     while ((str = reader.ReadLine()) != null) 
     { 
      list.Add(str); 
     } 
    } 
    return list.ToArray(); 
} 

Vous pouvez utiliser réflecteur pour vérifier d'autres méthodes, comme vous pouvez le voir est assez simple

Pour lire le contenu le fichier, jetez un oeil à:

12

Il y a un peu d'histoire intéressante derrière les méthodes apparemment en double dans la classe File. Il est survenu après une étude d'utilisabilité sur une version préliminaire de .NET. Ils ont demandé à un groupe de programmeurs expérimentés d'écrire du code pour manipuler les fichiers. Ils n'ont jamais été exposés à .NET auparavant et avaient juste les docs à travailler. Le taux de réussite était de 0%.

Oui, il y a une différence. Vous saurez quand vous essayez de lire un fichier d'un gigaoctet ou plus. C'est un crash garanti sur la version 32 bits. Pas un tel problème avec un StreamReader qui lit ligne par ligne, il utilisera très peu de mémoire. Cela dépend de ce que fait le reste de votre programme, mais essayez de limiter la méthode de commodité aux fichiers de taille inférieure à, disons, quelques mégaoctets.