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

时间:2015-09-16 18:07:44

标签: c# file dictionary io

我遇到的问题显然是been encountered before,但解决方案对我所看到的情况没有帮助。

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

  1. 它被创建
  2. 某些默认值会添加到Dictionary
  3. Dictionary变为基础64数据
  4. 数据将写入文件
  5. 步骤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.");
    }
    

    需要注意的重要事实:“写入文件”。消息永远不会记录到控制台(但如果我在File.WriteAllLines调用之前直接放置日志,则会记录日志)。最后Console.Log电话会议的断点从不加注。

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

    CONFIG_FILE_PATHC:\Users\Me\Documents\longpath\bin\Debug\config\general.cgf的常量值。

    我也尝试使用FileStreamFileStream.Flush(),正如我在顶部链接的问题所示 - 这不起作用。

1 个答案:

答案 0 :(得分:3)

File.Create method并没有做出您认为确实如此的事情。

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

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

根据垃圾收集的运行时间,File.WriteAllText调用将能够写入文件,或者您将获得IOException。事实上,你没有看到任何写入文件的内容,并且你没有看到在电话会议后写出的文字,这表明你实际上得到了一个例外但却在其他一些层面上得到了忽略它。

如果要使用File.Create创建文件,则应获取FileStream对象并将其置于关闭文件中:

using (FileStream stream = File.Create(CONFIG_FILE_PATH)) {
}

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