gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:55:03 33 4
gpt4 key购买 nike

我有一个问题显然是 been encountered before ,尽管解决方案对我所看到的没有帮助。

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

  1. 它被创建
  2. 一些默认值被添加到 Dictionary
  3. Dictionary变成base 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.");
}

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

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

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

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

最佳答案

File.Create method并不像您认为的那样。

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

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

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

如果你想使用 File.Create 创建文件,你应该获取 FileStream 对象并处理它以关闭文件:

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

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

关于c# - 为什么 File.WriteAllText 不将数据写入文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32615680/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com