Cách dễ nhất để đọc và ghi vào tệp


341

Có rất nhiều cách khác nhau để đọc và ghi tệp ( tệp văn bản , không phải nhị phân) trong C #.

Tôi chỉ cần một cái gì đó dễ dàng và sử dụng ít mã nhất, bởi vì tôi sẽ làm việc với các tệp rất nhiều trong dự án của tôi. Tôi chỉ cần một cái gì đó stringvì tất cả những gì tôi cần là đọc và viết strings.

Câu trả lời:


544

Sử dụng File.Read ALLTextFile.WriteAllText .

Nó không thể đơn giản hơn ...

Ví dụ 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
Thực sự rất đơn giản, nhưng tại sao sau đó lại cần phải đăng câu hỏi? OP có lẽ, giống như tôi và 17 người lên, nhìn theo hướng "sai" dọc theo dòng string.Write(filename). Tại sao giải pháp microsofts đơn giản / tốt hơn của tôi?
Roland

7
@Roland, Trong .net, xử lý tệp được cung cấp bởi khung chứ không phải ngôn ngữ (không có từ khóa C # để khai báo và thao tác các tệp chẳng hạn). Chuỗi là một khái niệm phổ biến hơn, phổ biến đến mức nó là một phần của C #. Do đó, điều tự nhiên là các tệp biết về chuỗi nhưng không phải ngược lại.
vc 74

Xml cũng là một khái niệm phổ biến với các kiểu dữ liệu trong C # và ở đây chúng tôi tìm thấy, ví dụ XmlDocument.Save (tên tệp). Nhưng tất nhiên sự khác biệt là thường một đối tượng Xml tương ứng với một tệp, trong khi một số chuỗi tạo thành một tệp.
Roland

7
@Roland nếu bạn muốn hỗ trợ, "foo".Write(fileName)bạn có thể dễ dàng tạo tiện ích mở rộng để làm như vậypublic static Write(this string value, string fileName) { File.WriteAllText(fileName, value);} và sử dụng nó trong các dự án của bạn.
Alexei Levenkov 17/2/2015

1
Ngoài ra còn có File.WriteAllLines (tên tệp, chuỗi [])
Mitch Wheat

162

Ngoài File.ReadAllText , File.ReadAllLinesFile.WriteAllText(và những người giúp đỡ tương tự từ Filelớp) được hiển thị trong một câu trả lời , bạn có thể sử dụng StreamWriter/ StreamReaderlớp.

Viết một tập tin văn bản:

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

Đọc tệp văn bản:

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

Ghi chú:

  • Bạn có thể sử dụng readtext.Dispose()thay vì using, nhưng nó sẽ không đóng tệp / reader / reader trong trường hợp ngoại lệ
  • Hãy lưu ý rằng đường dẫn tương đối liên quan đến thư mục làm việc hiện tại. Bạn có thể muốn sử dụng / xây dựng đường dẫn tuyệt đối.
  • Thiếu using/ Closelà lý do rất phổ biến của "tại sao dữ liệu không được ghi vào tệp".

3
Đảm bảo usingluồng của bạn như được hiển thị trong câu trả lời khác - stackoverflow.com/a/7571213/477420
Alexei Levenkov 17/215

5
Cần using System.IO;sử dụng StreamWriterStreamReader .
chất béo

1
Cũng cần lưu ý rằng nếu tệp không tồn tại, StreamWriter sẽ tạo tệp khi nó cố gắng WriteLine. Trong trường hợp này, write.txt sẽ được tạo nếu nó không tồn tại khi WriteLine được gọi.
TheMiddleMan

3
Cũng đáng chú ý là có quá tải để nối văn bản vào tệp: new StreamWriter("write.txt", true)Nó sẽ tạo một tệp nếu không tệp không tồn tại, nếu không nó sẽ nối vào tệp hiện có.
ArieKanarie

Cũng đáng chú ý là nếu bạn sử dụng bộ đọc và phát trực tuyến kết hợp với FileStream (chuyển nó thay vì tên tệp), bạn có thể mở tệp ở chế độ chỉ đọc và / hoặc chế độ chia sẻ.
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
Tại sao bạn không phản hồi fsvào cuối?
LuckyLikey

1
@LuckyLikey vì StreamReader làm điều đó cho bạn. Tuy nhiên, việc lồng nhau của việc sử dụng thứ 2 là không cần thiết
Novaterata

Bạn có thể giải thích? Tại sao StreamReader loại bỏ fs ?? Nó chỉ có thể loại bỏ sr như xa như tôi có thể nhìn thấy. Chúng ta có cần một tuyên bố sử dụng thứ ba ở đây?
Philm

Bạn không bao giờ Vứt bỏ một đối tượng trong câu lệnh đang sử dụng, khi câu lệnh được trả về, phương thức Dispose sẽ được gọi tự động và không có vấn đề gì nếu các câu lệnh được lồng hay không, cuối cùng, mọi thứ đều được sắp xếp trong ngăn xếp cuộc gọi.
Patrik Forsberg

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

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

Đơn giản, dễ dàng và cũng loại bỏ / làm sạch đối tượng một khi bạn đã hoàn thành với nó.


10

Cách dễ nhất để đọc từ tệp và ghi vào tệp:

//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
Tại sao không File.WriteAllTextcho phần viết?
Peter Mortensen

9

@AlexeiLevenkov chỉ cho tôi một "cách dễ nhất" khác là phương pháp mở rộng . Chỉ cần một chút mã hóa, sau đó cung cấp cách dễ nhất để đọc / ghi, cộng với nó cung cấp sự linh hoạt để tạo các biến thể theo nhu cầu cá nhân của bạn. Dưới đây là một ví dụ hoàn chỉnh:

Điều này xác định phương thức mở rộng trên stringloại. Lưu ý rằng điều duy nhất thực sự quan trọng là đối số hàm với từ khóa bổ sung this, làm cho nó tham chiếu đến đối tượng mà phương thức được đính kèm. Tên lớp không quan trọng; lớp và phương thức phải được khai báo 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

Đây là cách sử dụng string extension method, lưu ý rằng nó tự động đề cập đến 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

Tôi sẽ không bao giờ tìm thấy điều này bản thân mình, nhưng nó hoạt động rất tốt, vì vậy tôi muốn chia sẻ điều này. Chúc vui vẻ!


7

Đây là những phương pháp tốt nhất và được sử dụng phổ biến nhất để ghi và đọc từ các tệp:

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

Cách cũ, mà tôi đã được dạy ở trường đại học là sử dụng trình đọc luồng / trình ghi luồng, nhưng Tệp phương thức I / O của ít khó hiểu hơn và yêu cầu ít dòng mã hơn. Bạn có thể nhập vào "Tệp." trong IDE của bạn (đảm bảo bạn bao gồm câu lệnh nhập System.IO) và xem tất cả các phương thức có sẵn. Dưới đây là các phương thức ví dụ để đọc / ghi chuỗi đến / từ tệp văn bản (.txt.) Bằng Ứng dụng Windows Forms.

Nối văn bản vào một tệp hiện có:

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

Nhận tên tệp từ người dùng thông qua hộp thoại tệp explorer / mở tệp (bạn sẽ cần điều này để chọn các tệp hiện có).

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

Nhận văn bản từ một tệp hiện có:

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

5

Hoặc, nếu bạn thực sự về các dòng:

System.IO.File cũng chứa một phương thức tĩnh WriteAllLines , vì vậy bạn có thể làm:

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

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

5

Thật tốt khi đọc để sử dụng điều khiển OpenFileDialog để duyệt đến bất kỳ tệp nào bạn muốn đọc. Tìm mã dưới đây:

Đừng quên thêm usingcâu lệnh sau để đọc tệp:using System.IO;

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

Để viết tập tin bạn có thể sử dụng phương pháp 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

Bạn đang tìm kiếm File, StreamWriterStreamReadercác lớp học.


6
Câu trả lời rất không có ích. Điều này có nghĩa là OP phải truy cập google các thuật ngữ này với hy vọng tìm được câu trả lời. Câu trả lời tốt nhất là một ví dụ.
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
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.