首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么File.WriteAllText不将数据写入文件?

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

Stack Overflow用户
提问于 2015-09-16 18:07:44
回答 1查看 6.1K关注 0票数 3

我遇到了一个很明显的been encountered before问题,尽管解决方案对我所看到的毫无帮助。

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

  1. 它被创造出来
  2. 将一些默认值添加到Dictionary
  3. Dictionary被转换为基本64数据。
  4. 数据被写入文件。

步骤1到步骤3运行良好。第4步看上去很正常,直到你打开文件--当文件中什么都没有的时候。它会被创建,但不会被写入,最后我会得到一个空文件。

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

代码语言:javascript
复制
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(),正如我在顶部链接的问题中所建议的--这是行不通的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 18:24:59

method不会做你认为它会做的事情。

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

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

根据垃圾回收的运行时间,File.WriteAllText调用要么可以写入文件,要么可以得到一个IOException。事实上,您没有看到任何写入文件的内容,也没有看到调用后写出的文本,这意味着您实际上得到了一个异常,但在其他级别捕捉到该异常并忽略它。

如果要使用File.Create创建文件,则应获取FileStream对象并将其配置为关闭文件:

代码语言:javascript
复制
using (FileStream stream = File.Create(CONFIG_FILE_PATH)) {
}

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32615680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档