C# 为什么';t File.WriteAllText是否将数据写入文件?

C# 为什么';t File.WriteAllText是否将数据写入文件?,c#,file,dictionary,io,C#,File,Dictionary,Io,显然,我遇到了一个问题,尽管解决方案对我所看到的没有帮助 我正试图根据字典内容的base64编码将数据写入文件。应该是这样的:如果文件不存在 它被创造出来了 一些默认值被添加到字典中 字典将转换为基本64位数据 数据将写入该文件 步骤1到3工作正常。第4步似乎工作得很好,直到我打开文件——当它显示里面什么都没有时。它被创建了,但没有写入,最后我得到了一个空文件 代码如下所示,如果文件不存在,则调用top方法(CreateDefaultConfigFile): private static voi

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

我正试图根据
字典
内容的base64编码将数据写入文件。应该是这样的:如果文件不存在

  • 它被创造出来了
  • 一些默认值被添加到
    字典中
  • 字典
    将转换为基本64位数据
  • 数据将写入该文件
  • 步骤1到3工作正常。第4步似乎工作得很好,直到我打开文件——当它显示里面什么都没有时。它被创建了,但没有写入,最后我得到了一个空文件

    代码如下所示,如果文件不存在,则调用top方法(
    CreateDefaultConfigFile
    ):

    private static void CreateDefaultConfigFile()
    {
    WriteLine(“AppConfig.CreateDefaultConfigFile”);
    创建(配置文件路径);
    Configuration.Clear();
    添加(“ClientId”、“5577”);
    添加(“重定向URI”https://stackexchange.com/oauth/login_success");
    添加(“请求键”、“2WQ5KSCzcyleyJ0QM4KHW”(“”);
    Save();
    }
    公共静态void Save()
    {
    Console.WriteLine(“AppConfig.Save”);
    字符串数据=”;
    foreach(配置中的KeyValuePair对)
    {
    WriteLine(“{0}:{1}”,pair.Key,pair.Value.ToString());
    if(pair.Value.GetType()==typeof(string))
    {
    数据+=对.Key+SC\u拆分器+对.Value+“\n”;
    }
    else if(pair.Value.GetType()==typeof(数组))
    {
    数据+=pair.Key+SC_拆分器+“[”+字符串.Join(“,”,pair.Value)+“]\n”;
    }
    其他的
    {
    配置。删除(配对密钥);
    }
    }
    if(data.EndsWith(“\n”))
    {
    data.Remove(data.Length-2);
    }
    byte[]dataBytes=Encoding.UTF8.GetBytes(数据);
    字符串编码=Convert.ToBase64String(数据字节);
    writealText(配置文件路径,编码);
    WriteLine(“写入文件”);
    }
    
    需要注意的重要事实:“Write to file.”消息永远不会记录到控制台(尽管如果我在
    file.writeAllines
    调用之前直接放置日志,它会记录日志)。最后一个
    控制台.log
    调用处的断点永远不会出现

    没有抛出异常,这并不是因为
    数据
    编码的
    为空,而是在写入之前将它们记录下来,以显示两者中的数据

    CONFIG\u FILE\u PATH
    是一个常量值
    C:\Users\Me\Documents\longpath\bin\Debug\CONFIG\general.cgf

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

    没有做你认为它做的事情

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

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

    根据垃圾收集的运行时间,
    File.WriteAllText
    调用将能够写入该文件,或者您将得到一个
    IOException
    。您没有看到写入该文件的任何内容,也没有看到调用后写入的文本,这表明您实际上得到了一个异常不要在其他层面上抓住它,然后忽略它

    如果要使用
    File.Create
    创建文件,应获取
    FileStream
    对象并将其释放以关闭文件:

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

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

    在for-each过程中无法删除项目。使用调试器并逐步完成代码。此外,如果情况变得更糟,并且希望捕获异常,请将代码包装为try{}catch{}并处理catch{}@MethodMan中的IO.Exception,我相信
    File.writealText
    self会关闭,因为没有要关闭的实例。
    CONFIG\u File\u PATH
    只是定义为
    私有静态只读字符串
    ,只分配一次。(顺便说一句
    File.Create
    );如果在具有输出的最后一个日志行的位置执行
    文件.writealText(“some_other_File”,“testcontent”)
    ,会发生什么?而且,这不可能是
    .cgf
    打字错误,对吗?我想要继续下去,您应该对该数据变量使用StringBuilder和
    pair.Value.ToString()
    using (FileStream stream = File.Create(CONFIG_FILE_PATH)) {
    }