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.

ApprenticeHacker
fonte

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);
vc 74
fonte
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".
Bali C
fonte
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");
    }
}
Swapnil
fonte
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.

Ankit Dass
fonte
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);
}
yazarloo
fonte
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!

Roland
fonte
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
}
technoman23
fonte
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);
anhoppe
fonte
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.

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

Você está procurando os File, StreamWritere StreamReaderclasses.

SLaks
fonte
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
    }
Alireza.m
fonte