为什么 File.WriteAllText 不将数据写入文件?

Art*_*ode 2 c# io dictionary file

我遇到了一个显然以前遇到过的问题,尽管解决方案对我所看到的没有帮助。

我正在尝试根据 .csv 文件内容的 base 64 编码将数据写入文件Dictionary<string, object>。它应该是这样的:如果文件不存在,

  1. 它被创建
  2. 一些默认值被添加到 Dictionary
  3. Dictionary变成基64个数据
  4. 数据写入文件

步骤 1 到 3 工作正常。第 4 步似乎工作正常,直到您打开文件 - 当发现其中没有任何内容时。它被创建但没有写入,我最终得到一个空文件。

代码是这样的,其中 top 方法(CreateDefaultConfigFile如果文件不存在则调用):

private static void CreateDefaultConfigFile()
{
    Console.WriteLine("AppConfig.CreateDefaultConfigFile");
    File.Create(CONFIG_FILE_PATH);
    Configuration.Clear();
    Configuration.Add("ClientId", "5577");
    Configuration.Add("RedirectUri", "https://stackexchange.com/oauth/login_success");
    Configuration.Add("RequestKey", "2WQ5ksCzcYLeeYJ0qM4kHw((");
    Save();
}

public static void Save()
{
    Console.WriteLine("AppConfig.Save");
    string data = "";
    foreach (KeyValuePair<string, object> pair in Configuration)
    {
        Console.WriteLine("  {0}: {1}", pair.Key, pair.Value.ToString());
        if (pair.Value.GetType() == typeof(string))
        {
            data += pair.Key + SC_SPLITTER + pair.Value + "\n";
        }
        else if (pair.Value.GetType() == typeof(Array))
        {
            data += pair.Key + SC_SPLITTER + "[" + string.Join(",", pair.Value) + "]\n";
        }
        else
        {
            Configuration.Remove(pair.Key);
        }
    }
    if (data.EndsWith("\n"))
    {
        data.Remove(data.Length - 2);
    }
    byte[] dataBytes = Encoding.UTF8.GetBytes(data);
    string encoded = Convert.ToBase64String(dataBytes);
    File.WriteAllText(CONFIG_FILE_PATH, encoded);
    Console.WriteLine("  Written to file.");
}
Run Code Online (Sandbox Code Playgroud)

需要注意的重要事实:“写入文件”。消息永远不会记录到控制台(尽管如果我在File.WriteAllLines调用之前直接放置日志,它会记录)。最后一次Console.Log调用的断点永远不会引发。

不会抛出任何异常,这不是因为dataencoded为空 - 在写入显示两者中的数据之前记录它们。

CONFIG_FILE_PATH是 的常数值C:\Users\Me\Documents\longpath\bin\Debug\config\general.cgf

我也试过使用 a FileStreamand FileStream.Flush(),正如我在顶部链接的问题中所建议的那样 - 这不起作用。

Guf*_*ffa 5

File.Create方法不会做您认为它会做的事情。

它确实创建了一个文件,但它也使文件保持打开状态并返回一个FileStream对象来处理打开的文件。

如果您只是调用Create并忽略返回的FileStream对象,则该文件将保持打开状态,直到垃圾收集器处理该对象。

根据垃圾收集运行的时间,File.WriteAllText调用将能够写入文件,或者您将获得IOException. 您没有看到任何写入文件的内容,并且您没有看到在调用后写出的文本,这一事实表明您实际上得到了一个异常,但在其他级别捕获它并忽略它。

如果要用于File.Create创建文件,则应获取FileStream对象并对其进行处置以关闭文件:

using (FileStream stream = File.Create(CONFIG_FILE_PATH)) {
}
Run Code Online (Sandbox Code Playgroud)

但是,您不必在调用之前File.WriteAllText创建文件,如果文件不存在,它将创建文件。