【发布时间】:2015-12-13 10:59:36
【问题描述】:
我遇到了一个显然是 been encountered before 的问题,尽管解决方案对我所看到的没有帮助。
我正在尝试根据Dictionary<string, object> 内容的base 64 编码将数据写入文件。它应该是这样的:如果文件不存在,
- 它被创建
- 一些默认值被添加到
Dictionary -
Dictionary转换为 base 64 数据 - 数据写入文件
步骤 1 到 3 运行良好。第 4 步 似乎 工作正常,直到您打开文件 - 当它显示其中没有任何内容时。它被创建但没有被写入,我最终得到一个空文件。
代码如下,顶部方法(如果文件不存在则调用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 调用处的断点永远不会引发。
不会引发异常,这并不是因为 data 或 encoded 为空 - 在写入显示两者中的数据之前记录它们。
CONFIG_FILE_PATH 是C:\Users\Me\Documents\longpath\bin\Debug\config\general.cgf 的常量值。
我也尝试过使用FileStream 和FileStream.Flush(),正如我在顶部链接的问题中所建议的那样 - 这不起作用。
【问题讨论】:
-
您不能在 for-each 期间删除项目。
-
使用调试器并单步执行代码。如果情况变得更糟并且您想捕获异常,请将代码包装在 try{}catch{} 周围并在 catch 中处理 IO.Exception {}
-
@MethodMan 我相信
File.WriteAllText会自行关闭,因为没有要关闭的实例。CONFIG_FILE_PATH被简单地定义为private static readonly string,只分配一次。 -
(顺便说一句
File.Create不是必需的);如果您在有输出的最后一个日志行的位置执行File.WriteAllText("some_other_file", "testcontent")会发生什么?而且,不会是.cgf错字吧? -
我想继续堆积,您应该为该数据变量使用 StringBuilder 和
pair.Value.ToString()。
标签: c# file dictionary io