Самый простой способ чтения и записи в файлы

343

Существует много различных способов чтения и записи файлов ( текстовых , а не двоичных) в C #.

Мне просто нужно что-то простое и использующее наименьшее количество кода, потому что я собираюсь много работать с файлами в своем проекте. Мне нужно только что-то, stringпотому что все, что мне нужно, это читать и писать stringс.

ApprenticeHacker
источник

Ответы:

547

Используйте File.ReadAllText и File.WriteAllText .

Это не может быть проще ...

Примеры 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);
ВК 74
источник
2
Очень просто, но зачем тогда нужно было публиковать вопрос? OP, вероятно, как я и 17 upvoters, смотрели в «неправильном» направлении по линии string.Write(filename). Почему решение Microsoft проще, чем у меня?
Роланд
7
@Roland, в .net обработка файлов обеспечивается платформой, а не языками (например, в C # нет ключевых слов для объявления и манипулирования файлами). Строки - это более распространенное понятие, настолько распространенное, что оно является частью C #. Поэтому естественно, что файлы знают о строках, но не наоборот.
ВК 74
Xml также является общей концепцией для типов данных в C #, и здесь мы находим, например, XmlDocument.Save (имя файла). Но, конечно, разница в том, что обычно один объект Xml соответствует одному файлу, а несколько строк образуют один файл.
Роланд
7
@Roland, если вы хотите поддержать, "foo".Write(fileName)вы можете легко создать расширение для этого public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}и использовать его в своих проектах.
Алексей Левенков
1
Существует также File.WriteAllLines (имя файла, строка [])
Mitch Wheat
163

В дополнение к File.ReadAllText, File.ReadAllLinesи и File.WriteAllText(и аналогичные помощники из Fileкласса), показанные в другом ответе, вы можете использовать StreamWriter/ StreamReaderклассы.

Написание текстового файла:

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

Чтение текстового файла:

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

Ноты:

  • Вы можете использовать readtext.Dispose()вместо using, но он не закроет файл / читатель / писатель в случае исключений
  • Помните, что относительный путь относительно текущего рабочего каталога. Вы можете использовать / построить абсолютный путь.
  • Отсутствует using/ Closeявляется очень распространенной причиной «почему данные не записываются в файл».
Бали С
источник
3
Убедитесь, что usingваши потоки, как показано в другом ответе - stackoverflow.com/a/7571213/477420
Алексей Левенков
5
Нужно using System.IO;использовать StreamWriter и StreamReader .
жир
1
Также следует отметить, что если файл не существует, StreamWriter создаст файл при попытке записи в LineLine. В этом случае write.txt будет создан, если он не существует, когда вызывается WriteLine.
TheMiddleMan
3
Также стоит отметить, что существует перегрузка для добавления текста в файл: new StreamWriter("write.txt", true)он создаст файл, если файл не существует, иначе он добавится к существующему файлу.
ArieKanarie
Также стоит отметить, что если вы используете потоковый ридер и потоковый писатель в сочетании с FileStream (передавайте его вместо имени файла), вы можете открывать файлы в режиме только для чтения и / или в режиме совместного использования.
Саймон Зикс
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
источник
1
Почему бы вам не спорить fsв конце?
LuckyLikey
1
@LuckyLikey, потому что StreamReader сделает это за вас.
Вложение
Вы можете объяснить? Почему StreamReader должен утилизировать fs ?? Он может распоряжаться СР только насколько я могу видеть. Нам нужен третий оператор использования здесь?
Фил
Вы никогда не удаляете объект в операторе using, когда оператор возвращается, метод Dispose будет вызываться автоматически, и не имеет значения, являются ли операторы вложенными или нет, в конце концов, все упорядочено в стеке вызовов.
Патрик Форсберг
11
using (var file = File.Create("pricequote.txt"))
{
    ...........                        
}

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

Простой, легкий, а также удаляет / очищает объект, как только вы закончите с ним.

Анкит Дасс
источник
10

Самый простой способ чтения из файла и записи в файл:

//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
источник
5
Почему бы не File.WriteAllTextнаписать часть?
Питер Мортенсен
9

@AlexeiLevenkov указал мне на другой «самый простой способ», а именно метод расширения . Требуется лишь небольшое программирование, а затем обеспечивается абсолютно простой способ чтения / записи, а также гибкость в создании вариантов в соответствии с вашими личными потребностями. Вот полный пример:

Это определяет метод расширения для stringтипа. Обратите внимание, что единственное, что действительно имеет значение, это аргумент функции с дополнительным ключевым словом this, который заставляет его ссылаться на объект, к которому прикреплен метод. Имя класса не имеет значения; класс и метод должны быть объявлены 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

Вот как использовать string extension method, обратите внимание, что это автоматически относится к 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

Я бы никогда не нашел это сам, но это прекрасно работает, поэтому я хотел поделиться этим. Радоваться, веселиться!

Roland
источник
7

Это лучшие и наиболее часто используемые методы записи и чтения из файлов:

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

Старым способом, которому меня учили в колледже, было использование потокового считывателя / потокового писателя, но файл методы ввода-вывода менее громоздки и требуют меньше строк кода. Вы можете ввести «Файл». в вашей IDE (убедитесь, что вы включили оператор импорта System.IO) и посмотрите все доступные методы. Ниже приведены примеры методов чтения / записи строк в / из текстовых файлов (.txt.) С помощью приложения Windows Forms.

Добавить текст в существующий файл:

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

Получите имя файла от пользователя через проводник / диалог открытия файла (он понадобится вам для выбора существующих файлов).

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

Получить текст из существующего файла:

private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
    string sFileNameAndPath = getFileNameFromUser();
    txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
technoman23
источник
5

Или, если вы действительно о линиях:

System.IO.File также содержит статический метод WriteAllLines , так что вы можете сделать:

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

File.WriteAllLines("./foo", myLines);
anhoppe
источник
5

При чтении полезно использовать элемент управления OpenFileDialog для поиска любого файла, который вы хотите прочитать. Найдите код ниже:

Не забудьте добавить следующую usingинструкцию для чтения файлов:using System.IO;

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

Для записи файлов вы можете использовать метод File.WriteAllText.

Tassisto
источник
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

Вы ищете File, StreamWriterи StreamReaderклассы.

SLaks
источник
6
Очень бесполезный ответ. Означает, что ОП теперь должен использовать эти термины в поисках ответа. Лучший ответ - пример.
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
источник