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

我遇到了一个问题,显然是由于 屡见不鲜但这些解决方案对我所看到的情况没有任何帮助。

我试图将数据写入一个文件,基于基数64的编码的内容的一个 Dictionary<string, object>. 应该是这样的:如果文件不存在。

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

第1到3步工作正常。第四步 出现 运作良好,直到你我打开文件–当你发现里面什么都没有的时候,它被创建了,但没有被写入,我最终得到的是一个空文件。它被创建了,但没有被写入,我最终得到的是一个空文件。

代码是这样的,其中顶部的方法(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.");
}

要注意的重要事实是:”Write to file. “消息永远不会被记录到控制台(尽管如果我直接在 “Write to file. File.WriteAllLines 调用,它确实会记录)。) 在最后的 Console.Log 呼叫从不加注。

没有抛出例外,这不是因为 dataencoded 是空的–在写之前记录它们会显示出这两个文件中的数据。

CONFIG_FILE_PATH 是一个常量的 C:\Users\Me\Documents\longpath\bin\Debug\config\general.cgf.

我也试过用 FileStreamFileStream.Flush()正如我在顶部链接的问题中所建议的那样–这不起作用。

解决方案:

的,我想把数据写到一个文件中,基于基数64编码的 … File.Create 办法 并不像你想象的那样。

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

如果你只是调用 Create 而对返回的 FileStream 对象,那么该文件将被打开,直到该对象被垃圾收集器处理掉。

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

如果你想使用 File.Create 来创建文件,你应该得到 FileStream 对象,并处理它来关闭文件。

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

然而,你不需要在调用 File.WriteAllText如果文件不存在,它将创建文件。

给TA打赏
共{{data.count}}人
人已打赏
未分类

当屏幕旋转时,onSaveInstanceState()不工作。

2022-9-9 5:41:16

未分类

如何在bamoo无头文件中用硒上传文件?

2022-9-9 5:41:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索