【问题标题】:How To Overwrite A File If It Already Exists?如果文件已经存在,如何覆盖它?
【发布时间】:2017-10-29 08:40:22
【问题描述】:

我正在制作音乐播放器。它有两种形式;一个是您播放音乐的主要区域。第二种形式有一个 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();
        }
    }
    }
    }

【问题讨论】:

  • 如果文件存在,为什么不直接删除?
  • 你的songRecord.writeRecord在做什么?如果您在擦除之前打开文件,它可能已经读入当前文本。
  • 根据 API 文档 File.WriteAllText 应该替换内容。如果没有,请提交错误报告。
  • 这是清除文件的代码。请将写入列表的代码粘贴到文件中。该部分包含错误。我很确定您可能没有关闭流编写器或文件。这就是为什么文件被锁定的原因,第二次尝试写入时,之前的锁定状态没有清除并导致问题。
  • 调试你的代码。并通过暂停来检查文件是否正在被清除。然后弄清楚是什么添加了内容。

标签: c# .net winforms text-files streamwriter


【解决方案1】:

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

【讨论】:

  • 在 C# .NET Compact Framework 中,没有 File.WriteAllText。什么是替代方案?谢谢。
  • @RuiMiguelPinheiro 我添加了一些您可能可以使用的代码
  • OpenWrite 是危险的,如果您写入文件中已有的较少字节,文件将包含新旧数据的混合。我建议用 FileMode.Create 代替 File.Open。​​
  • @Hogan 感谢您的反馈,我已经更新了示例
【解决方案2】:

使用这个

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

【讨论】:

    【解决方案3】:

    有关 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2019-11-12
      • 2015-06-14
      相关资源
      最近更新 更多