如果文件已经存在,如何覆盖?

问题描述 投票:8回答:3

我正在制作音乐播放器。它有两种形式;一个是你演奏音乐的主要区域。第二种形式有一个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文件。它只是添加到现有文件。有什么我不对的吗?

这是我的streamreader / writer代码。我很确定我在跑步后也关闭它,但也许有人可以弄清楚出了什么问题:

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();
        }
    }
    }
    }
c# .net winforms text-files streamwriter
3个回答
17
投票

WriteAllText

File.WriteAllText应该做你想要的。

创建一个新文件,将指定的字符串写入该文件,然后关闭该文件。如果目标文件已存在,则会被覆盖。

的StreamWriter

StreamWriter class还有一个覆盖/附加选项:

使用默认编码和缓冲区大小为指定文件初始化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);
    }
}

1
投票

用这个

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
投票

请参阅此链接以获取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();
© www.soinside.com 2019 - 2024. All rights reserved.