La forma más fácil de leer y escribir en archivos

341

Hay muchas formas diferentes de leer y escribir archivos ( archivos de texto , no binarios) en C #.

Solo necesito algo que sea fácil y use la menor cantidad de código, porque voy a trabajar mucho con archivos en mi proyecto. Solo necesito algo stringporque todo lo que necesito es leer y escribir strings.

AprendizHacker
fuente

Respuestas:

544

Utilice File.ReadAllText y File.WriteAllText .

No podría ser más simple ...

Ejemplos de 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
fuente
2
Muy simple de hecho, pero ¿por qué entonces fue necesario publicar la pregunta? OP fue probablemente, como yo y los 17 votantes, mirando en la dirección "equivocada" en la línea de string.Write(filename). ¿Por qué la solución de Microsofts es más simple / mejor que la mía?
Roland
77
@Roland, en .net, el marco de trabajo proporciona el manejo de archivos, no los lenguajes (no hay palabras clave de C # para declarar y manipular archivos, por ejemplo). Las cadenas son un concepto más común, tan común que forma parte de C #. Por lo tanto, es natural que los archivos sepan sobre cadenas pero no lo contrario.
vc 74
Xml también es un concepto común con tipos de datos en C # y aquí encontramos, por ejemplo, XmlDocument.Save (nombre de archivo). Pero, por supuesto, la diferencia es que generalmente un objeto Xml corresponde a un archivo, mientras que varias cadenas forman un archivo.
Roland
77
@Roland si desea brindar soporte "foo".Write(fileName), puede crear fácilmente extensiones para hacerlo public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}y usarlo en sus proyectos.
Alexei Levenkov
1
También hay File.WriteAllLines (nombre de archivo, cadena [])
Mitch Wheat
162

Además de File.ReadAllText, File.ReadAllLines, y File.WriteAllText(y ayudantes similares de Fileclase) que se muestran en otra respuesta se puede usar StreamWriter/ StreamReaderclases.

Escribir un archivo de texto:

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

Leer un archivo de texto:

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

Notas:

  • Se puede utilizar readtext.Dispose()en lugar de using, pero no va a cerrar el archivo / lector / escritor en caso de excepciones
  • Tenga en cuenta que la ruta relativa es relativa al directorio de trabajo actual. Es posible que desee utilizar / construir ruta absoluta.
  • Falta using/ Closees una razón muy común de "por qué los datos no se escriben en el archivo".
Bali C
fuente
3
Asegúrese de que usingsus corrientes como se muestra en otra respuesta - stackoverflow.com/a/7571213/477420
Alexei Levenkov
55
Necesita using System.IO;usar StreamWriter y StreamReader .
gordo
1
También debe tenerse en cuenta que si el archivo no existe, StreamWriter creará el archivo cuando intente escribir en la línea. En este caso, se creará write.txt si no existe cuando se llama a WriteLine.
TheMiddleMan
3
También vale la pena señalar que hay una sobrecarga para agregar texto al archivo: new StreamWriter("write.txt", true)creará un archivo si no existe un archivo, de lo contrario se agregará al archivo existente.
ArieKanarie
También vale la pena señalar que si usa el lector de secuencias y el redactor de secuencias junto con un FileStream (páselo en lugar del nombre del archivo) puede abrir archivos en modo de solo lectura y / o modo compartido.
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
fuente
1
¿Por qué no disponse fsal final?
LuckyLikey
1
@LuckyLikey porque StreamReader hace eso por ti. Sin embargo
Novaterata
¿Puedes explicar? ¿Por qué debería StreamReader disponer de fs? Solo puede disponer de sr hasta donde puedo ver. ¿Necesitamos una tercera declaración de uso aquí?
Philm
Nunca deseche un objeto en una instrucción de uso, cuando se devuelve la instrucción, se llamará automáticamente al método Dispose, y no importa si las instrucciones están anidadas o no, al final, todo se ordena en la pila de llamadas.
Patrik Forsberg el
11
using (var file = File.Create("pricequote.txt"))
{
    ...........                        
}

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

Simple, fácil y también desecha / limpia el objeto una vez que haya terminado con él.

Ankit Dass
fuente
10

La forma más fácil de leer de un archivo y escribir en un archivo:

//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
fuente
55
¿Por qué no File.WriteAllTextpara escribir parte?
Peter Mortensen
9

@AlexeiLevenkov me señaló otra "forma más fácil", a saber, el método de extensión . Solo requiere un poco de codificación, luego proporciona la forma más fácil de leer / escribir, además ofrece la flexibilidad de crear variaciones de acuerdo con sus necesidades personales. Aquí hay un ejemplo completo:

Esto define el método de extensión en el stringtipo. Tenga en cuenta que lo único que realmente importa es el argumento de la función con una palabra clave adicional this, que hace que se refiera al objeto al que está asociado el método. El nombre de la clase no importa; La clase y el método deben ser declarados 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

Así es como se usa string extension method, tenga en cuenta que se refiere automáticamente a 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

Nunca lo habría encontrado yo mismo, pero funciona muy bien, así que quería compartir esto. ¡Que te diviertas!

Roland
fuente
7

Estos son los mejores y más utilizados métodos para escribir y leer archivos:

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

La forma antigua, que me enseñaron en la universidad, era usar el lector de secuencias / escritor de secuencias, pero los métodos de E / S de archivos son menos torpes y requieren menos líneas de código. Puede escribir "Archivo". en su IDE (asegúrese de incluir la declaración de importación System.IO) y vea todos los métodos disponibles. A continuación se presentan métodos de ejemplo para leer / escribir cadenas en / desde archivos de texto (.txt.) Utilizando una aplicación de formularios Windows Forms.

Agregar texto a un archivo existente:

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

Obtenga el nombre del archivo del usuario a través del explorador de archivos / diálogo de archivo abierto (lo necesitará para seleccionar los archivos existentes).

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

Obtener texto de un archivo existente:

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

O, si realmente te interesan las líneas:

System.IO.File también contiene un método estático WriteAllLines , por lo que puede hacer:

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

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

Es bueno cuando se lee para usar el control OpenFileDialog para buscar cualquier archivo que desee leer. Encuentra el código a continuación:

No olvide agregar la siguiente usingdeclaración para leer archivos:using System.IO;

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

Para escribir archivos puedes usar el método File.WriteAllText.

Tassisto
fuente
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
fuente
1

Usted está buscando los File, StreamWritery StreamReaderlas clases.

SLaks
fuente
66
Respuesta muy inútil. Esto significa que el OP ahora debe buscar en Google estos términos con la esperanza de encontrar una respuesta. La mejor respuesta es un ejemplo.
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
fuente