【问题标题】:File.WriteAllText does not overwrite if file exists如果文件存在,File.WriteAllText 不会覆盖
【发布时间】:2018-06-30 12:54:27
【问题描述】:

我正在检查文件是否存在,如果不存在,“创建并关闭”。否则,“覆盖”,但覆盖永远不会发生,只会追加。

    if (!File.Exists(filePath))
        File.WriteAllText(filePath, data);
    else
        File.WriteAllText(filePath, data);

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

它旨在覆盖,但它没有。我做错了什么?

我的完整代码:

static void Save<T, Y>(Dictionary<T,Y> dict, List<Y> list, string path)
    {
        foreach (var val in dict.Values)
            list.Add(val);

        string data = JsonHelper.ToJson(list.ToArray(), true);
        Debug.Log("saving version: " + data);

        string filePath = Application.dataPath + path;

        if (!File.Exists(filePath))
            File.WriteAllText(filePath, data);
        else
            File.WriteAllText(filePath, data);
    }

编辑:

我已添加:

if (!File.Exists(filePath))
            File.WriteAllText(filePath, data);
        else
        {
            Debug.Log("never called?");
            File.Delete(filePath);
            File.WriteAllText(filePath, data);
        }

debug.log 被调用,删除似乎被跳过(?)然后 WriteAllText 使文件变大,追加重复。

已解决

复制自身的是数据,而不是文件。字典不允许重复,但我保存了一个列表,然后通过添加保存文件中的项目来加载它。列表允许重复,这反过来看起来好像我没有覆盖文件。

【问题讨论】:

  • path 的价值是什么? (显示一些例子)......和Application.dataPath,也许我错了,但我找不到类似的东西......Application.StartupPath等等 - 是的,但是dataPath(??)
  • 对不起,我应该提一下“Application.dataPath”是一个 Unity 方法。
  • 显然data包含了新旧内容,所以你用错误的数据覆盖了文件。
  • 是的,没错。只是想弄清楚它是如何同时获得新旧的。

标签: c#


【解决方案1】:

File.WriteAllText Method (String, String)

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

File.Delete Method (String)

删除指定的文件。

这是黑白的。如果发生其他任何事情,您需要调试您的应用程序,因为要么抛出异常,要么您的路径不是您认为的那样,或者数据不是您认为的那样。 CLR 和 Windows API 不会掷骰子

祝你好运

更新

谢谢。我已经删除了第二个文件功能并留下了删除, 我已经验证过的作品。我试过更改文件名 其他论点并且有效。只剩下里面的数据。 我保存了一个 带有 if else 语句的字典以防止重复,但文件 充满了重复,所以在加载时抛出一个异常 存在重复

字典可以防止键而不是值的重复,值可以整天重复

foreach (var key in dict.Keys)
   list.Add(key );

或者如果你想要不同的值(取决于数据类型)

foreach (var val in dict.Values.Distinct())
   list.Add(val );

【讨论】:

  • 谢谢。我已经删除了第二个文件功能并留下了删除,我已经验证了它的工作原理。我已经尝试在 else 参数中更改文件名并且有效。只剩下里面的数据。我用 if else 语句保存了一个字典以防止重复,但是文件中充满了重复项,因此在加载时会抛出一个异常,即存在重复项。
  • 你先生,真是个天才,我保存的数据似乎附加到了字符串上。
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多