Najłatwiejszy sposób na czytanie i zapisywanie plików

342

Istnieje wiele różnych sposobów odczytu i zapisu plików ( plików tekstowych , a nie binarnych) w języku C #.

Potrzebuję tylko czegoś, co jest łatwe i wymaga najmniejszej ilości kodu, ponieważ będę dużo pracować z plikami w moim projekcie. Potrzebuję tylko czegoś, stringponieważ wszystko, czego potrzebuję, to czytać i pisać string.

ApprenticeHacker
źródło

Odpowiedzi:

545

Użyj File.ReadAllText i File.WriteAllText .

To nie może być prostsze ...

Przykłady 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);
wer. 74
źródło
2
Rzeczywiście bardzo proste, ale dlaczego więc trzeba było zadać pytanie? OP prawdopodobnie, podobnie jak ja i 17 zwolenników, patrzyło w „złym” kierunku wzdłuż linii string.Write(filename). Dlaczego rozwiązanie Microsofts jest prostsze / lepsze niż moje?
Roland,
7
@Roland, w .net, obsługa plików jest zapewniona przez framework, a nie języki (na przykład nie ma słów kluczowych C # do deklarowania i manipulowania plikami). Ciągi są bardziej powszechną koncepcją, tak powszechną, że jest częścią C #. Dlatego naturalne jest, że pliki wiedzą o ciągach, ale nie odwrotnie.
74
Xml jest również popularną koncepcją z typami danych w C # i tutaj znajdujemy np. XmlDocument.Save (nazwa pliku). Ale oczywiście różnica polega na tym, że zwykle jeden obiekt Xml odpowiada jednemu plikowi, podczas gdy kilka ciągów tworzy jeden plik.
Roland
7
@Roland, jeśli chcesz wesprzeć "foo".Write(fileName), możesz łatwo utworzyć rozszerzenie, aby to polubić public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}i używać w swoich projektach.
Aleksiej Lewenkow
1
Istnieje również File.WriteAllLines (nazwa pliku, ciąg [])
Mitch Wheat
163

Oprócz File.ReadAllText, File.ReadAllLines, oraz File.WriteAllText(i podobne pomocnicy od Fileklasy) pokazane w innej odpowiedzi można użyć StreamWriter/ StreamReaderklas.

Pisanie pliku tekstowego:

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

Czytanie pliku tekstowego:

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

Uwagi:

  • Możesz użyć readtext.Dispose()zamiast using, ale nie zamknie pliku / czytnika / programu zapisującego w przypadku wyjątków
  • Należy pamiętać, że ścieżka względna jest względna do bieżącego katalogu roboczego. Możesz użyć / skonstruować ścieżkę bezwzględną.
  • Brak using/ Closejest bardzo częstą przyczyną „dlaczego dane nie są zapisywane do pliku”.
Bali C.
źródło
3
Upewnij się, że usingTwoje strumienie są pokazane w innej odpowiedzi - stackoverflow.com/a/7571213/477420
Alexei Levenkov
5
Musisz using System.IO;użyć StreamWriter i StreamReader .
tłuszcz
1
Należy również zauważyć, że jeśli plik nie istnieje, StreamWriter utworzy plik, gdy będzie próbował WriteLine. W takim przypadku zostanie utworzony plik write.txt, jeśli nie istnieje on przy wywołaniu WriteLine.
TheMiddleMan
3
Warto również zauważyć, że istnieje przeciążenie, aby dołączyć tekst do pliku: new StreamWriter("write.txt", true)utworzy plik, jeśli nie plik nie istnieje, w przeciwnym razie zostanie dołączony do istniejącego pliku.
ArieKanarie
Warto również zauważyć, że jeśli używasz streamreadera i streamwriter w połączeniu z FileStream (przekazujesz zamiast nazwy pliku), możesz otwierać pliki w trybie tylko do odczytu i / lub w trybie współdzielonym.
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");
    }
}
Swapnil
źródło
1
Dlaczego fsna koniec nie reagujesz ?
LuckyLikey
1
@LuckyLikey, ponieważ StreamReader robi to za Ciebie. Zagnieżdżanie drugiego użycia nie jest jednak konieczne
Novaterata,
Możesz wytłumaczyć? Dlaczego StreamReader powinien pozbyć się FS? Może tylko pozbyć się sr, o ile widzę. Czy potrzebujemy tutaj trzeciego oświadczenia dotyczącego używania?
Philm
Nigdy nie usuwaj obiektu w instrukcji using, gdy zwracana jest instrukcja, metoda Dispose będzie wywoływana automatycznie i nie ma znaczenia, czy instrukcje są zagnieżdżone, czy nie, w końcu wszystko jest uporządkowane w stosie wywołań.
Patrik Forsberg,
11
using (var file = File.Create("pricequote.txt"))
{
    ...........                        
}

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

Prosty, łatwy, a także usuwa / czyści obiekt po zakończeniu.

Ankit Dass
źródło
10

Najłatwiejszy sposób czytania z pliku i zapisu do pliku:

//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
źródło
5
Dlaczego nie File.WriteAllTextdo pisania części?
Peter Mortensen
9

@AlexeiLevenkov wskazał mi inny „najprostszy sposób”, mianowicie metodę rozszerzenia . Zajmuje tylko trochę kodowania, a następnie zapewnia absolutnie najłatwiejszy sposób odczytu / zapisu, a ponadto oferuje elastyczność tworzenia odmian zgodnie z osobistymi potrzebami. Oto kompletny przykład:

Definiuje to metodę rozszerzenia dla stringtypu. Zauważ, że jedyną rzeczą, która naprawdę się liczy, jest argument funkcji z dodatkowym słowem kluczowym this, który powoduje, że odnosi się do obiektu, do którego jest podłączona metoda. Nazwa klasy nie ma znaczenia; klasa i metoda muszą zostać zadeklarowane 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

Oto jak korzystać z string extension method, zauważ, że odnosi się automatycznie do 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

Nigdy bym tego nie znalazł, ale działa świetnie, więc chciałem się tym podzielić. Baw się dobrze!

Roland
źródło
7

Oto najlepsze i najczęściej stosowane metody zapisu i odczytu plików:

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

Starym sposobem, którego nauczyłem się na studiach, było korzystanie z czytnika / pisarki strumieniowej, ale metody we / wy File są mniej niezręczne i wymagają mniejszej liczby wierszy kodu. Możesz wpisać „Plik”. w swoim IDE (upewnij się, że dołączasz instrukcję importu System.IO) i zobacz wszystkie dostępne metody. Poniżej znajdują się przykładowe metody odczytu / zapisu ciągów do / z plików tekstowych (.txt.) Za pomocą aplikacji Windows Forms.

Dołącz tekst do istniejącego pliku:

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

Uzyskaj nazwę pliku od użytkownika za pomocą eksploratora plików / otwórz okno dialogowe pliku (będzie to konieczne, aby wybrać istniejące pliki).

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

Pobierz tekst z istniejącego pliku:

private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
    string sFileNameAndPath = getFileNameFromUser();
    txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
technoman23
źródło
5

Lub, jeśli naprawdę chodzi o linie:

System.IO.File zawiera również metodę statyczną WriteAllLines , dzięki czemu można wykonać:

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

File.WriteAllLines("./foo", myLines);
anhoppe
źródło
5

Podczas czytania dobrze jest użyć kontrolki OpenFileDialog do przeglądania dowolnego pliku, który chcesz przeczytać. Znajdź kod poniżej:

Nie zapomnij dodać następującej usinginstrukcji, aby odczytać pliki:using System.IO;

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

Do pisania plików możesz użyć metody File.WriteAllText.

Tassisto
źródło
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);
        }      
    }
Md.Rakibuz Sultan
źródło
1

Szukasz w File, StreamWriteri StreamReaderklas.

SLaks
źródło
6
Bardzo niepomocna odpowiedź. Oznacza to, że PO musi teraz przejść do wyszukiwarki tych warunków w nadziei na znalezienie odpowiedzi. Najlepsza odpowiedź to przykład.
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
źródło