Manière la plus simple de lire et d'écrire dans des fichiers

343

Il existe de nombreuses façons de lire et d'écrire des fichiers ( fichiers texte , pas binaires) en C #.

J'ai juste besoin de quelque chose de facile et qui utilise le moins de code possible, car je vais beaucoup travailler avec des fichiers dans mon projet. Je n'ai besoin que de quelque chose, stringcar tout ce dont j'ai besoin est de lire et d'écrire string.

ApprenticeHacker
la source

Réponses:

547

Utilisez File.ReadAllText et File.WriteAllText .

Cela ne pourrait pas être plus simple ...

Exemples MSDN:

// Create a file to write to.
string createText = "Hello and Welcome" + Environment.NewLine;
File.WriteAllText(path, createText);

// Open the file to read from.
string readText = File.ReadAllText(path);
vc 74
la source
2
Très simple en effet, mais pourquoi fallait-il alors poser la question? OP était probablement, comme moi et les 17 votants, regardant dans la «mauvaise» direction le long de la ligne de string.Write(filename). Pourquoi la solution Microsofts est-elle plus simple / meilleure que la mienne?
Roland
7
@Roland, Dans .net, la gestion des fichiers est fournie par le framework, pas par les langages (il n'y a pas de mots clés C # pour déclarer et manipuler des fichiers par exemple). Les chaînes sont un concept plus courant, si courant qu'il fait partie de C #. Il est donc naturel que les fichiers connaissent les chaînes mais pas l'inverse.
vc 74
Xml est également un concept courant avec les types de données en C # et nous trouvons ici par exemple XmlDocument.Save (nom de fichier). Mais bien sûr, la différence est que généralement un objet Xml correspond à un fichier, tandis que plusieurs chaînes forment un fichier.
Roland
7
@Roland si vous voulez soutenir, "foo".Write(fileName)vous pouvez facilement créer une extension pour le faire public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}et l'utiliser dans vos projets.
Alexei Levenkov
1
Il existe également File.WriteAllLines (nom de fichier, chaîne [])
Mitch Wheat
163

En plus de File.ReadAllText, File.ReadAllLineset File.WriteAllText(et des aides similaires de la Fileclasse) affichés dans une autre réponse, vous pouvez utiliser StreamWriter/ StreamReaderclasses.

Écrire un fichier texte:

using(StreamWriter writetext = new StreamWriter("write.txt"))
{
    writetext.WriteLine("writing in text file");
}

Lecture d'un fichier texte:

using(StreamReader readtext = new StreamReader("readme.txt"))
{
   string readText = readtext.ReadLine();
}

Remarques:

  • Vous pouvez utiliser à la readtext.Dispose()place de using, mais il ne fermera pas le fichier / lecteur / écrivain en cas d'exceptions
  • Sachez que le chemin relatif est relatif au répertoire de travail actuel. Vous voudrez peut-être utiliser / construire un chemin absolu.
  • Manquant using/ Closeest une raison très courante de "pourquoi les données ne sont pas écrites dans un fichier".
Bali C
la source
3
Assurez-vous de usingvos flux comme indiqué dans d'autres réponses - stackoverflow.com/a/7571213/477420
Alexei Levenkov
5
Besoin using System.IO;d'utiliser StreamWriter et StreamReader .
graisse
1
Il convient également de noter que si le fichier n'existe pas, StreamWriter créera le fichier lorsqu'il tentera d'écrire en ligne. Dans ce cas, write.txt sera créé s'il n'existe pas lors de l'appel de WriteLine.
TheMiddleMan
3
Il convient également de noter qu'il existe une surcharge pour ajouter du texte au fichier: new StreamWriter("write.txt", true)il créera un fichier si ce fichier n'existe pas, sinon il sera ajouté au fichier existant.
ArieKanarie
Il convient également de noter que si vous utilisez le streamreader et le streamwriter en conjonction avec un FileStream (passez-le à la place du nom de fichier), vous pouvez ouvrir des fichiers en mode lecture seule et / ou en mode partagé.
Simon Zyx
18
FileStream fs = new FileStream(txtSourcePath.Text,FileMode.Open, FileAccess.Read);
using(StreamReader sr = new StreamReader(fs))
{
   using (StreamWriter sw = new StreamWriter(Destination))
   {
            sw.writeline("Your text");
    }
}
Swapnil
la source
1
Pourquoi ne vous disponse pas fsà la fin?
LuckyLikey
1
@LuckyLikey parce que StreamReader le fait pour vous. L'emboîtement de la 2e utilisation n'est cependant pas nécessaire
Novaterata
Peux-tu expliquer? Pourquoi StreamReader devrait-il disposer de fs ?? Il ne peut que disposer autant que je peux voir. Avons-nous besoin d'une troisième déclaration d'utilisation ici?
Philm
Vous ne supprimez jamais un objet dans une instruction using, lorsque l'instruction est renvoyée, la méthode Dispose sera appelée automatiquement, et peu importe si les instructions sont imbriquées ou non, au final, tout est ordonné dans la pile des appels.
Patrik Forsberg
11
using (var file = File.Create("pricequote.txt"))
{
    ...........                        
}

using (var file = File.OpenRead("pricequote.txt"))
{
    ..........
}

Simple, facile et élimine / nettoie également l'objet une fois que vous en avez terminé.

Ankit Dass
la source
10

La façon la plus simple de lire à partir d'un fichier et d'écrire dans un fichier:

//Read from a file
string something = File.ReadAllText("C:\\Rfile.txt");

//Write to a file
using (StreamWriter writer = new StreamWriter("Wfile.txt"))
{
    writer.WriteLine(something);
}
yazarloo
la source
5
Pourquoi pas File.WriteAllTextpour écrire une partie?
Peter Mortensen
9

@AlexeiLevenkov m'a indiqué une autre "manière la plus simple", à savoir la méthode d'extension . Cela prend juste un peu de codage, puis fournit le moyen le plus simple de lire / écrire, et il offre la flexibilité de créer des variations selon vos besoins personnels. Voici un exemple complet:

Cela définit la méthode d'extension sur le stringtype. Notez que la seule chose qui compte vraiment est l'argument de fonction avec un mot this- clé supplémentaire , qui le fait se référer à l'objet auquel la méthode est attachée. Le nom de classe n'a pas d'importance; la classe et la méthode doivent être déclarées static.

using System.IO;//File, Directory, Path

namespace Lib
{
    /// <summary>
    /// Handy string methods
    /// </summary>
    public static class Strings
    {
        /// <summary>
        /// Extension method to write the string Str to a file
        /// </summary>
        /// <param name="Str"></param>
        /// <param name="Filename"></param>
        public static void WriteToFile(this string Str, string Filename)
        {
            File.WriteAllText(Filename, Str);
            return;
        }

        // of course you could add other useful string methods...
    }//end class
}//end ns

Voici comment utiliser le string extension method, notez qu'il se réfère automatiquement à class Strings:

using Lib;//(extension) method(s) for string
namespace ConsoleApp_Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            "Hello World!".WriteToFile(@"c:\temp\helloworld.txt");
            return;
        }

    }//end class
}//end ns

Je ne l'aurais jamais trouvé moi-même, mais cela fonctionne très bien, donc je voulais partager cela. S'amuser!

Roland
la source
7

Voici les méthodes les meilleures et les plus couramment utilisées pour écrire et lire des fichiers:

using System.IO;

File.AppendAllText(sFilePathAndName, sTextToWrite);//add text to existing file
File.WriteAllText(sFilePathAndName, sTextToWrite);//will overwrite the text in the existing file. If the file doesn't exist, it will create it. 
File.ReadAllText(sFilePathAndName);

L'ancienne méthode, qui m'a été enseignée au collège, consistait à utiliser le lecteur de flux / l'écrivain de flux, mais le fichier méthodes d'E / S sur sont moins maladroites et nécessitent moins de lignes de code. Vous pouvez taper "Fichier". dans votre IDE (assurez-vous d'inclure l'instruction d'importation System.IO) et consultez toutes les méthodes disponibles. Vous trouverez ci-dessous des exemples de méthodes de lecture / écriture de chaînes vers / depuis des fichiers texte (.txt.) À l'aide d'une application Windows Forms.

Ajoutez du texte à un fichier existant:

private void AppendTextToExistingFile_Click(object sender, EventArgs e)
{
    string sTextToAppend = txtMainUserInput.Text;
    //first, check to make sure that the user entered something in the text box.
    if (sTextToAppend == "" || sTextToAppend == null)
    {MessageBox.Show("You did not enter any text. Please try again");}
    else
    {
        string sFilePathAndName = getFileNameFromUser();// opens the file dailog; user selects a file (.txt filter) and the method returns a path\filename.txt as string.
        if (sFilePathAndName == "" || sFilePathAndName == null)
        {
            //MessageBox.Show("You cancalled"); //DO NOTHING
        }
        else 
        {
            sTextToAppend = ("\r\n" + sTextToAppend);//create a new line for the new text
            File.AppendAllText(sFilePathAndName, sTextToAppend);
            string sFileNameOnly = sFilePathAndName.Substring(sFilePathAndName.LastIndexOf('\\') + 1);
            MessageBox.Show("Your new text has been appended to " + sFileNameOnly);
        }//end nested if/else
    }//end if/else

}//end method AppendTextToExistingFile_Click

Obtenez le nom de fichier de l'utilisateur via l'explorateur de fichiers / boîte de dialogue d'ouverture de fichier (vous en aurez besoin pour sélectionner les fichiers existants).

private string getFileNameFromUser()//returns file path\name
{
    string sFileNameAndPath = "";
    OpenFileDialog fd = new OpenFileDialog();
    fd.Title = "Select file";
    fd.Filter = "TXT files|*.txt";
    fd.InitialDirectory = Environment.CurrentDirectory;
    if (fd.ShowDialog() == DialogResult.OK)
    {
        sFileNameAndPath = (fd.FileName.ToString());
    }
    return sFileNameAndPath;
}//end method getFileNameFromUser

Obtenez du texte à partir d'un fichier existant:

private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
    string sFileNameAndPath = getFileNameFromUser();
    txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
technoman23
la source
5

Ou, si vous êtes vraiment sur les lignes:

System.IO.File contient également une méthode statique WriteAllLines , vous pouvez donc faire:

IList<string> myLines = new List<string>()
{
    "line1",
    "line2",
    "line3",
};

File.WriteAllLines("./foo", myLines);
anhoppe
la source
5

Il est bon lors de la lecture d'utiliser le contrôle OpenFileDialog pour rechercher n'importe quel fichier que vous souhaitez lire. Trouvez le code ci-dessous:

N'oubliez pas d'ajouter la usingdéclaration suivante pour lire les fichiers:using System.IO;

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
         textBox1.Text = File.ReadAllText(openFileDialog1.FileName);  
    }
}

Pour écrire des fichiers, vous pouvez utiliser la méthode File.WriteAllText.

Tassisto
la source
2
     class Program
    { 
         public static void Main()
        { 
            //To write in a txt file
             File.WriteAllText("C:\\Users\\HP\\Desktop\\c#file.txt", "Hello and Welcome");

           //To Read from a txt file & print on console
             string  copyTxt = File.ReadAllText("C:\\Users\\HP\\Desktop\\c#file.txt");
             Console.Out.WriteLine("{0}",copyTxt);
        }      
    }
Md.Rakibuz Sultan
la source
1

Vous cherchez les File, StreamWriteret les StreamReaderclasses.

SLaks
la source
6
Réponse très inutile. Les moyens le PO doit maintenant aller google ces termes dans l'espoir de trouver une réponse. La meilleure réponse est un exemple.
tno2007
0
private void Form1_Load(object sender, EventArgs e)
    {
        //Write a file
        string text = "The text inside the file.";
        System.IO.File.WriteAllText("file_name.txt", text);

        //Read a file
        string read = System.IO.File.ReadAllText("file_name.txt");
        MessageBox.Show(read); //Display text in the file
    }
Alireza.m
la source