Найпростіший спосіб для читання та запису у файли


342

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

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

Відповіді:


545

Використовуйте 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);

2
Насправді дуже просто, але чому тоді потрібно було ставити питання? ОП, мабуть, як я і 17 учасників, дивлячись у "неправильному" напрямку по лінії string.Write(filename). Чому рішення Microsofts простіше / краще, ніж моє?
Роланд

7
@Roland, In .net, обробка файлів забезпечується рамками, а не мовами (немає ключових слів C # для декларування та обробки файлів, наприклад). Струни - це більш поширене поняття, настільки поширене, що воно є частиною C #. Тому природно, що файли знають про рядки, але не навпаки.
vc 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 створить файл при спробі WriteLine. У цьому випадку write.txt буде створений, якщо він не існує, коли викликається WriteLine.
TheMiddleMan

3
Також варто зазначити, що для додавання тексту до файлу є перевантаження: new StreamWriter("write.txt", true)це створить файл, якщо файл не існує, інакше він додасть до існуючого файлу.
ArieKanarie

Також варто зазначити, що якщо ви використовуєте streamreader та streamwriter спільно з 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");
    }
}

1
Чому ви не розлучитеся fsнаприкінці?
LuckyLikey

1
@LuckyLikey, тому що StreamReader робить це за вас.
Вкладення

Ти можеш пояснити? Чому StreamReader має розпоряджатися fs ?? Він може розпоряджатись sr лише наскільки я бачу. Чи потрібен нам третій оператор, що використовує тут?
Філм

Ви ніколи не розпоряджаєтесь об'єктом у використовуваному операторі, коли оператор буде повернуто, метод 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);
}

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

Я б цього ніколи не знайшов, але це чудово працює, тому я хотів цим поділитися. Весело!


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
}

5

Або якщо ви дійсно про лінії:

System.IO.File також містить статичний метод WriteAllLines , так що ви можете зробити:

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

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

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.


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класи.


6
Дуже непомітна відповідь. Засоби ОП тепер повинні перейти в Google ці терміни, сподіваючись знайти відповідь. Найкраща відповідь - приклад.
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
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.