Dosyalardan okuma ve dosyalara yazmanın en kolay yolu


343

C # 'da dosya ( metin değil, ikili değil) okumak ve yazmak için birçok farklı yol vardır .

Projemde çok fazla dosyayla çalışacağım için, kolay ve en az kod kullanan bir şeye ihtiyacım var. Sadece bir şeye ihtiyacım var stringçünkü ihtiyacım olan tek şey okumak ve yazmak string.

Yanıtlar:


546

Kullanım File.ReadAllText ve File.WriteAllText .

Daha basit olamazdı ...

MSDN örnekleri:

// 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
Gerçekten çok basit, ama neden soruyu yayınlamak gerekiyordu? Muhtemelen OP, kendim ve 17 upvoter gibi, çizgileri boyunca "yanlış" yöne bakıyordu string.Write(filename). Microsofts çözümü neden benimkinden daha basit / daha iyi?
Roland

7
@Roland. Dizeler daha yaygın bir kavramdır, o kadar yaygındır ki C # 'ın bir parçasıdır. Bu nedenle, dosyaların dizeler hakkında bilmesi doğaldır, ancak tam tersi değildir.
vc 74

Xml ayrıca C # 'da veri tiplerine sahip ortak bir kavramdır ve burada örneğin XmlDocument.Save (dosya adı) buluyoruz. Ancak elbette fark, genellikle bir Xml nesnesinin bir dosyaya karşılık gelmesidir, bazı dizeler ise bir dosya oluşturur.
Roland

7
@Roland eğer desteklemek "foo".Write(fileName)istiyorsanız kolayca bunu yapmak için uzantı oluşturabilir public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}ve projelerinizde kullanabilirsiniz.
Alexei Levenkov

1
Ayrıca File.WriteAllLines (dosya adı, dize []) var
Mitch Wheat

163

Ayrıca etmek File.ReadAllText, File.ReadAllLinesve File.WriteAllText(gelen ve benzeri yardımcıları Filegösterilen sınıfın) başka bir yanıt kullanabilirsiniz StreamWriter/ StreamReadersınıfları.

Metin dosyası yazma:

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

Metin dosyası okuma:

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

Notlar:

  • Bunun readtext.Dispose()yerine kullanabilirsiniz using, ancak istisnalar durumunda dosyayı / okuyucu / yazıcıyı kapatmaz
  • Göreli yolun geçerli çalışma dizinine göreli olduğunu unutmayın. Mutlak yol kullanmak / oluşturmak isteyebilirsiniz.
  • Eksik using/ Close"verinin neden dosyaya yazılmadığının" çok yaygın bir nedenidir.

3
usingDiğer yanıtlarda gösterildiği gibi akışlarınıza dikkat edin - stackoverflow.com/a/7571213/477420
Alexei Levenkov

5
İhtiyaç using System.IO;kullanmak StreamWriter ve StreamReader .
Şişman

1
Ayrıca dosya yoksa, StreamWriter'ın WriteLine'i denemeye çalıştığında dosyayı oluşturacağına dikkat edilmelidir. Bu durumda WriteLine çağrıldığında mevcut değilse write.txt dosyası oluşturulur.
TheMiddleMan

3
Ayrıca dikkat edilmesi gereken nokta, dosyaya metin eklemek için bir aşırı yüklenme olmasıdır: new StreamWriter("write.txt", true)Dosya yoksa bir dosya oluşturur, aksi takdirde mevcut dosyaya eklenir.
ArieKanarie

Ayrıca, streamreader ve streamwriter'ı bir FileStream (dosya adı yerine ilet) ile birlikte kullanıyorsanız, dosyaları salt okunur modda ve / veya paylaşılan modda açabileceğinizi belirtmek gerekir.
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
Sonunda neden tepki vermiyorsun fs?
LuckyLikey

1
@LuckyLikey çünkü StreamReader bunu sizin için yapıyor. Bununla birlikte, 2. kullanımın yuvalanması gerekli değildir
Novaterata

Açıklayabilir misin? StreamReader neden fs imha etmeli? Sadece gördüğüm kadarıyla imha edebilir. Burada üçüncü bir kullanım ifadesine ihtiyacımız var mı?
Philm

Hiçbir ifadeyi bir nesneyi using ifadesine atamazsınız, deyim döndürüldüğünde Dispose yöntemi otomatik olarak çağrılır ve ifadelerin iç içe yerleştirilip yerleştirilmemesi önemli değildir, sonuçta her şey çağrı yığınında sıralanır.
Patrik Forsberg

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

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

Basit, kolay ve ayrıca işiniz bittiğinde nesneyi temizler / temizler.


10

Bir dosyadan okumanın ve bir dosyaya yazmanın en kolay yolu:

//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
Neden File.WriteAllTextbölüm yazmıyorsunuz?
Peter Mortensen

9

@AlexeiLevenkov başka bir "en kolay yol" yani uzatma yöntemini işaret etti . Sadece küçük bir kodlama gerektirir, daha sonra okuma / yazma için mutlak en kolay yolu sağlar, ayrıca kişisel ihtiyaçlarınıza göre varyasyonlar oluşturma esnekliği sunar. İşte tam bir örnek:

Bu, stringtürdeki uzantı yöntemini tanımlar . Gerçekten önemli olan tek şeyin this, yöntemin bağlı olduğu nesneye başvurmasını sağlayan ekstra anahtar kelimeye sahip işlev bağımsız değişkeni olduğuna dikkat edin. Sınıf adı önemli değil; sınıf ve yöntem olmalıdır ilan edilmesi 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

Bu, otomatik olarak aşağıdakilere string extension methodatıfta bulunduğunu unutmayı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

Bunu asla kendim bulamazdım, ama harika çalışıyor, bu yüzden bunu paylaşmak istedim. İyi eğlenceler!


7

Bunlar, dosyalara yazma ve dosyalardan okuma için en iyi ve en yaygın kullanılan yöntemlerdir:

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

Üniversitede bana öğretilen eski yol akış okuyucu / akış yazıcı kullanmaktı, ancak Dosya G / Ç yöntemleri daha az karmaşık ve daha az kod satırı gerektiriyordu. "Dosya" yazabilirsiniz. IDE'nizde (System.IO içe aktarma ifadesini eklediğinizden emin olun) ve mevcut tüm yöntemleri görün. Aşağıda, Windows Forms Uygulaması kullanılarak metin dosyalarına (.txt.) Dizeleri okumak / yazmak için örnek yöntemler verilmiştir.

Mevcut bir dosyaya metin ekleyin:

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

Dosya gezgini / dosya aç iletişim kutusu aracılığıyla kullanıcıdan dosya adını alın (mevcut dosyaları seçmek için buna ihtiyacınız olacaktır).

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

Mevcut bir dosyadan metin alın:

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

5

Veya gerçekten çizgilerle ilgili iseniz:

System.IO.File ayrıca WriteAllLines statik bir yöntem içerir , böylece şunları yapabilirsiniz:

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

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

5

Okurken, okumak istediğiniz dosyalara göz atmak için OpenFileDialog denetimini kullanmak iyidir. Aşağıdaki kodu bulun:

usingDosyaları okumak için aşağıdaki ifadeyi eklemeyi unutmayın :using System.IO;

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

Dosya yazmak için yöntemi kullanabilirsiniz 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

Aradığınız File, StreamWriterve StreamReadersınıflar.


6
Çok yardımcı olmayan bir cevap. OP'nin artık bir cevap bulma umuduyla bu terimleri Google'a taşıması gerektiği anlamına geliyor. En iyi cevap bir örnektir.
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
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.