วิธีที่ง่ายที่สุดในการอ่านและเขียนไฟล์


342

มีหลายวิธีในการอ่านและเขียนไฟล์ ( ไฟล์ข้อความไม่ใช่ไบนารี) ใน C #

ฉันต้องการสิ่งที่ง่ายและใช้รหัสน้อยที่สุดเพราะฉันจะทำงานกับไฟล์จำนวนมากในโครงการของฉัน ฉันต้องการเพียงบางสิ่งบางอย่างstringตั้งแต่ทั้งหมดที่ฉันต้องการก็คือการอ่านและเขียนstrings

คำตอบ:


546

ใช้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
ง่ายมากแน่นอน แต่ทำไมต้องโพสต์คำถาม OP อาจจะเป็นเหมือนตัวเองและ 17 upvoters มองใน "ผิด" string.Write(filename)ทิศทางตามสายของ เหตุใดโซลูชันของ Microsoft จึงเรียบง่ายกว่าดีกว่าของฉัน
Roland

7
@Roland ใน. net การจัดการไฟล์ถูกจัดเตรียมโดยเฟรมเวิร์กไม่ใช่ภาษา (ไม่มีคำสำคัญ C # ในการประกาศและจัดการไฟล์เช่น) สตริงเป็นแนวคิดที่ใช้กันทั่วไปกว่าดังนั้นจึงเป็นส่วนหนึ่งของ C # ดังนั้นจึงเป็นเรื่องปกติที่ไฟล์จะรู้เกี่ยวกับสตริง แต่ไม่ตรงข้าม
vc 74

Xml ยังเป็นแนวคิดทั่วไปที่มีประเภทข้อมูลใน C # และที่นี่เราพบเช่น XmlDocument.Save (ชื่อไฟล์) แต่แน่นอนความแตกต่างคือโดยปกติแล้ววัตถุ Xml หนึ่งตัวจะสอดคล้องกับไฟล์เดียวในขณะที่สตริงจำนวนมากจะรวมเป็นไฟล์เดียว
Roland

7
@Roland หากคุณต้องการสนับสนุน"foo".Write(fileName)คุณสามารถสร้างส่วนขยายเพื่อทำเช่นนั้นpublic static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}และใช้ในโครงการของคุณ
Alexei Levenkov

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แต่จะไม่ปิดไฟล์ / reader / writer ในกรณีที่มีข้อยกเว้น
  • โปรดทราบว่าเส้นทางสัมพัทธ์สัมพันธ์กับไดเรกทอรีการทำงานปัจจุบัน คุณอาจต้องการใช้ / สร้างเส้นทางที่แน่นอน
  • ไม่มีusing/ Closeเป็นสาเหตุที่พบบ่อยมากของ "เหตุใดจึงไม่เขียนข้อมูลลงในไฟล์"

3
อย่าลืมusingสตรีมของคุณตามที่แสดงในคำตอบอื่น ๆ - stackoverflow.com/a/7571213/477420
Alexei Levenkov

5
ความจำเป็นในusing System.IO;การใช้StreamWriterและStreamReader
ไขมัน

1
ควรสังเกตว่าหากไฟล์ไม่มี StreamWriter จะสร้างไฟล์เมื่อพยายาม WriteLine ในกรณีนี้ write.txt จะถูกสร้างขึ้นหากไม่มีอยู่เมื่อเรียกใช้ WriteLine
TheMiddleMan

3
นอกจากนี้ยังมีข้อสังเกตว่ามีโอเวอร์โหลดในการต่อท้ายข้อความเป็นไฟล์: new StreamWriter("write.txt", true)มันจะสร้างไฟล์หากไม่มีไฟล์อยู่มิฉะนั้นไฟล์จะต่อท้ายไฟล์ที่มีอยู่
ArieKanarie

สิ่งที่ควรสังเกตคือถ้าคุณใช้ streamreader และ streamwriter ร่วมกับ FileStream (ส่งผ่านแทนที่จะเป็นชื่อไฟล์) คุณสามารถเปิดไฟล์ในโหมดอ่านอย่างเดียวและ / หรือโหมดที่ใช้ร่วมกัน
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");
    }
}

1
ทำไมคุณถึงไม่แยกย้ายกันfsไปในตอนท้าย?
LuckyLikey

1
@ LuckyLikey เพราะ StreamReader ทำเพื่อคุณ ไม่จำเป็นต้องใช้รังของการใช้งานครั้งที่ 2
Novaterata

คุณสามารถอธิบาย? ทำไม StreamReader จึงกำจัด fs มันสามารถกำจัด sr เท่าที่ฉันเห็น เราต้องการคำสั่งที่สามโดยใช้คำสั่งที่นี่หรือไม่?
Philm

คุณไม่เคยทิ้งวัตถุในการใช้คำสั่งเมื่อคำสั่งจะถูกส่งกลับวิธีการกำจัดจะถูกเรียกโดยอัตโนมัติและมันไม่สำคัญว่าคำสั่งจะซ้อนกันหรือไม่ในตอนท้ายทุกอย่างจะสั่งในกองการโทร
Patrik Forsberg

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เขียนส่วนหนึ่ง
Peter Mortensen

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

วิธีการแบบเก่าซึ่งผมได้รับการสอนในวิทยาลัยคือการใช้เครื่องอ่านกระแส / นักเขียนสตรีม แต่ไฟล์วิธี I / O เป็น clunky น้อยและจำเป็นต้องใช้สายน้อยลงรหัส คุณสามารถพิมพ์ใน "ไฟล์" ใน 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
คำตอบที่ไม่ช่วยเหลือมาก หมายความว่า OP จะต้องไปที่ 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
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.