A maneira mais fácil de ler e gravar em arquivos


341

Existem várias maneiras diferentes de ler e gravar arquivos ( arquivos de texto , não binários) em C #.

Eu só preciso de algo que seja fácil e use a menor quantidade de código, porque eu vou trabalhar muito com arquivos no meu projeto. Eu só preciso de algo, stringpois tudo o que preciso é ler e escrever strings.

Respostas:


544

Use File.ReadAllText e File.WriteAllText .

Não poderia ser mais simples ...

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

2
Muito simples, de fato, mas por que então era necessário postar a pergunta? O OP provavelmente estava, como eu e os 17 promotores, olhando na direção "errada" ao longo das linhas de string.Write(filename). Por que a solução Microsofts é mais simples / melhor que a minha?
— 21413 Roland

7
@Roland, No .net, a manipulação de arquivos é fornecida pela estrutura, não pelos idiomas (não há palavras-chave em C # para declarar e manipular arquivos, por exemplo). Strings são um conceito mais comum, tão comum que faz parte do C #. Portanto, é natural que os arquivos saibam sobre strings, mas não o contrário.
— vc 74

Xml também é um conceito comum com tipos de dados em C # e aqui encontramos, por exemplo, XmlDocument.Save (nome do arquivo). Mas é claro que a diferença é que geralmente um objeto Xml corresponde a um arquivo, enquanto várias strings formam um arquivo.
— Roland

7
@Roland, se você quiser dar suporte, "foo".Write(fileName)pode criar facilmente extensões para fazê-lo public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}e usá-las em seus projetos.
— Alexei Levenkov 17/02

11
Há também File.WriteAllLines (nome do arquivo, string [])
— Mitch Wheat

162

Além de File.ReadAllText, File.ReadAllLinese File.WriteAllText(e ajudantes similares da Fileclasse) mostrados em outra resposta, você pode usar StreamWriter/StreamReader classes.

Escrevendo um arquivo de texto:

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

Lendo um arquivo de texto:

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

Notas:

  • Você pode usar em readtext.Dispose()vez deusing , mas ele não fechará o arquivo / leitor / gravador em caso de exceções
  • Esteja ciente de que o caminho relativo é relativo ao diretório de trabalho atual. Você pode querer usar / construir o caminho absoluto.
  • Falta using/ Closeé um motivo muito comum de "por que os dados não são gravados no arquivo".

3
Certifique-se de usingseus fluxos, como mostrado na outra resposta - stackoverflow.com/a/7571213/477420
— Alexei Levenkov

5
Precisa using System.IO;usar o StreamWriter e o StreamReader .
— fat

11
Também deve ser observado que, se o arquivo não existir, o StreamWriter criará o arquivo quando tentar o WriteLine. Nesse caso, o write.txt será criado se ele não existir quando o WriteLine for chamado.
— TheMiddleMan

3
Também digno de nota é que há uma sobrecarga para anexar texto ao arquivo: new StreamWriter("write.txt", true)ele criará um arquivo se não houver arquivo, ou será anexado ao arquivo existente.
— ArieKanarie 22/03

Também digno de nota é que, se você usar o leitor de fluxo e o gravador de fluxo em conjunto com um FileStream (passe-o em vez do nome do arquivo), poderá abrir arquivos no modo somente leitura e / ou no modo compartilhado.
— 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");
    }
}

11
Por que você não dispõe fsno final?
— LuckyLikey

11
@LuckyLikey porque o StreamReader faz isso por você. O assentamento da 2ª usando não é necessário, no entanto
— Novaterata

Você pode explicar? Por que o StreamReader deve descartar fs ?? Só pode dispor sr até onde eu posso ver. Precisamos de uma terceira declaração usando aqui?
— Philm

Você nunca Dispose um objeto em uma instrução using, quando a instrução é retornada, o método Dispose será chamado automaticamente e não importa se as instruções estão aninhadas ou não, no final, tudo está ordenado na pilha de chamadas.
— Patrik Forsberg

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

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

Simples, fácil e também elimina / limpa o objeto quando você terminar.


10

A maneira mais fácil de ler e gravar em um arquivo:

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

5
Por que não File.WriteAllTextescrever parte?
— Peter Mortensen

9

@AlexeiLevenkov me apontou para outra "maneira mais fácil", a saber, o método de extensão . É preciso apenas um pouco de codificação e, em seguida, fornece a maneira mais fácil de ler / gravar, além de oferecer a flexibilidade de criar variações de acordo com suas necessidades pessoais. Aqui está um exemplo completo:

Isso define o método de extensão no stringtipo. Observe que a única coisa que realmente importa é o argumento da função com palavra-chave extra this, que o faz se referir ao objeto ao qual o método está anexado. O nome da classe não importa; a classe e o método devem 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

Isto é como usar o string extension method, observe que ele se refere automaticamente 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

Eu nunca teria encontrado isso sozinho, mas funciona muito bem, então eu queria compartilhar isso. Diverta-se!


7

Estes são os métodos melhores e mais usados ​​para gravar e ler arquivos:

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

A maneira antiga, que me ensinaram na faculdade, era usar o leitor / gravador de stream, mas o File métodos de E / S de são menos desajeitados e exigem menos linhas de código. Você pode digitar "Arquivo". no seu IDE (inclua a instrução de importação System.IO) e veja todos os métodos disponíveis. Abaixo estão exemplos de métodos para leitura / gravação de strings de / para arquivos de texto (.txt.) Usando um aplicativo Windows Forms.

Anexe texto a um arquivo 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

Obtenha o nome do arquivo do usuário através do diálogo explorador de arquivos / abrir arquivo (você precisará dele para selecionar os arquivos 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

Obtenha texto de um arquivo existente:

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

5

Ou, se você realmente gosta de linhas:

System.IO.File também contém um método estático WriteAllLines , para que você possa fazer:

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

File.WriteAllLines("./foo", myLines);

5

É bom ao ler usar o controle OpenFileDialog para navegar para qualquer arquivo que você deseja ler. Encontre o código abaixo:

Não se esqueça de adicionar a seguinte usinginstrução para ler arquivos:using System.IO;

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

Para escrever arquivos que você pode usar o método File.WriteAllText.


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

1

Você está procurando os File, StreamWritere StreamReaderclasses.


6
Resposta muito inútil. Os meios pelos quais o OP agora deve procurar esses termos no Google, na esperança de encontrar uma resposta. A melhor resposta é um exemplo.
— precisa saber é

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
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.