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位数据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)) {
}