it-swarm.com.ru

Как перезаписать файл, если он уже существует?

Я делаю музыкальный плеер. Имеет 2 формы; одна из них - главная область, где вы играете музыку. Во второй форме есть CheckedListBox, в котором вы выбираете нужные mp3-файлы . Когда я нажимаю кнопку, она сохраняет выбор в файле .txt, поэтому я могу получить к ним доступ в первой форме, где я помещу строки в пути для музыкального проигрывателя, чтобы найти файлы.

Это код моей второй формы, где я сохраняю выбранные песни в текстовые файлы .txt.

private void selectbtn_Click(object sender, EventArgs e)
{
    if (File.Exists(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt"))
    {
       File.WriteAllText(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt", String.Empty);
    }

    string[] checkedtitles = new string[checkedListBox1.CheckedItems.Count]; 

    for (int ii = 0; ii < checkedListBox1.CheckedItems.Count; ii++)
    {
        checkedtitles[ii] = checkedListBox1.CheckedItems[ii].ToString();
    }
    string selectedSongs = String.Join(Environment.NewLine, checkedtitles); 

    songRecord.writeRecord(selectedSongs); //I initialised the class containing streamwriter/reader, and called it songRecord
    this.Close();   
}

Проблема в том, что всякий раз, когда я закрываю программу и открываю ее снова, я не могу переписать/очистить файл .txt. Это просто добавляет к существующему файлу. Есть что-то, что я не правильно делаю?

Вот мои потоковые/пишущие коды. Я почти уверен, что закрыл его и после запуска, но, возможно, кто-то может понять, что не так:

namespace songss
{
    class DataRecord
    {
    public void writeRecord(string line)
    {
        StreamWriter sw = null;
        try
        {
            sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
            sw.WriteLine(line);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error: File not found.");
        }
        catch (IOException)
        {
            Console.WriteLine("Error: IO");
        }
        catch(Exception)
        {
            throw;
        }
        finally
        {
            if (sw != null)
                sw.Close();
        }
        }

 public void readRecord()
    {
        StreamReader sr = null;
        string myInputline;
        try
        {
            sr = new StreamReader(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt");
            while ((myInputline = sr.ReadLine()) != null) ; //readline reads whole line
            Console.WriteLine(myInputline);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error: File not found");
        }
        catch(IOException)
        {
            Console.WriteLine("Error: IO");
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            if (sr != null)
                sr.Close();
        }
    }
    }
    }
7
Manny

WriteAllText

File.WriteAllText должен делать то, что вы хотите.

Создает новый файл, записывает указанную строку в файл, а затем закрывает файл Если целевой файл уже существует, он перезаписывается.

StreamWriter

Класс StreamWriter также имеет возможность перезаписать/добавить:

Инициализирует новый экземпляр класса StreamWriter для указанного файл с использованием кодировки по умолчанию и размера буфера. Если файл существует, его можно перезаписать или добавить.

public StreamWriter(
    string path,
    bool append
)

Пример:

using (StreamWriter writer = new StreamWriter("test.txt", false)){ 
    writer.Write(textToAdd);
}

Глядя на свой код, вы передаете true, что означает добавление.

sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
sw.WriteLine(line);

.NET Compact Framework

Если вы застряли в версии .NET, которая ничего не поддерживает (например, компактная структура), вы также можете реализовать WriteAllText самостоятельно:

static void WriteAllText(string path, string txt) {
    var bytes = Encoding.UTF8.GetBytes(txt);
    using (var f = File.Open(path, FileMode.Create)) {
        f.Write(bytes, 0, bytes.Length);
    }
}
16
Nicholas

Перейдите по этой ссылке для решения, предоставленного Microsoft: ( https://msdn.Microsoft.com/en-us/library/system.io.file.appendtext(v=vs.110).aspx )

Вот код для добавления существующего файла:

StreamWriter writer = File.AppendText(Filepath);
writer.WriteLine(content);
writer.Close();
0
AutomationNerd

Использовать этот

File.WriteAllText(@"C:\Users\Me\Desktop\JAM_MACHINE\JAMS\record.txt", line);

вместо 

sw = new StreamWriter(@"C:\Users\Me\Desktop\JAM_MACHINE\record.txt", true);
            sw.WriteLine(line);
0
Brian Daniel Tiongco