C# StreamWriter没有';不要写入没有';不存在

C# StreamWriter没有';不要写入没有';不存在,c#,file-io,xna,filestream,xna-4.0,C#,File Io,Xna,Filestream,Xna 4.0,我正在为我的游戏制作关卡编辑器,除了。。。 当我试图保存我的文件(XML)时,该文件不会被创建,在输出框中,我得到: 类型为“System.NullReferenceException”的第一次意外异常 有趣的是,它只发生在文件不存在的情况下,但如果我覆盖另一个文件,它会正常工作 以下是我正在使用的代码: using (StreamWriter stream = new StreamWriter(filePath)) { stream.Write(data); stream.Cl

我正在为我的游戏制作关卡编辑器,除了。。。 当我试图保存我的文件(XML)时,该文件不会被创建,在输出框中,我得到:

类型为“System.NullReferenceException”的第一次意外异常

有趣的是,它只发生在文件不存在的情况下,但如果我覆盖另一个文件,它会正常工作

以下是我正在使用的代码:

using (StreamWriter stream = new StreamWriter(filePath))
{
    stream.Write(data);
    stream.Close();
}

数据是一个字符串(这不是问题,因为它在我覆盖文件时起作用)

您是否尝试过不使用file.Create()?像这样:

using (StreamWriter stream = new StreamWriter(filePath)) {
    stream.Write(data);
    stream.Close();
}
您可以使用一个布尔值来帮助创建文件:

using (StreamWriter stream = new StreamWriter(filePath, false)) {
    stream.Write(data);
    stream.Close();
}
然而,逻辑实际上并不比这复杂多少:

公共StreamWriter(
字符串路径,
布尔附加
)

确定是否将数据附加到文件。如果文件 exists且append为false,文件被覆盖。如果文件 如果存在且append为true,则将数据追加到文件中。 否则,将创建一个新文件


为什么不简单地绕过它,在写入之前检查文件是否存在:

public void Foo(string path, string data)
{
    if (!File.Exists(path))
        File.Create(path);

        using (var sw = new StreamWriter(path, false))
        {
            // Work your magic.
            sw.Write();
        }
}

就我个人而言,我真的不会让事情变得更复杂。另外,不要关闭
StreamWriter
using
语句在达到目的后将其处理。

在我以非管理员身份运行程序的情况下,该文件将写入具有管理员权限的文件夹中(甚至在ProgramFiles或任何非管理员位置中)。永远不会创建该文件,您必须手动启用
托管调试助手
异常中断,以便查看任何错误



解决方案是删除该文件夹并使用我的非管理员帐户再次创建它。还要注意,StreamWriter只创建目录树,文件。

哪一行给出了
NullReferenceException
?它并没有说,我认为StreamWriter必须捕获异常并调试。WriteLine消息我唯一能想到的是程序没有创建目录的权限。请尝试使用(仅用于调试目的)删除
,然后查看是否出现更有意义的异常。@ChrisF nope,异常仍然没有出现,只是写入了输出中box@luisperezphd是的,如果文件存在,它们可以工作。这是第一种工作方式,我复制粘贴了备份(对不起;)当我运行这段代码时,如果它不存在,它会创建一个文件。覆盖它确实存在-这不是你想要的行为吗?好的,我明白了,这是它应该的行为方式,但它在你的特定计算机上不起作用。你能得到堆栈跟踪吗?您是否尝试过查看是否有最新版本的.NET framework?也许你对这个文件夹有写权限,但没有创建权限?我有最新的.net framework,我很确定我对这个文件夹有创建权限。至于堆栈跟踪,很抱歉,在出现错误后我似乎无法调试,它只是恢复程序。您可以尝试运行免费的filemon应用程序,看看它是否提供了更多详细信息。VisualStudio中还有一个设置,当抛出任何异常(即使是已处理的异常)时,该设置将冻结应用程序。最后,您可以添加代码来输出堆栈跟踪。好吧,这使得流附加到文件,我想替换文件如果文件存在,我想覆盖它,而不是附加到itI。我不认为这是正确的重载。问题不是文件被覆盖了,而是它没有被创建。@ChrisF我看了一下,如果
append
false
,这个构造函数将始终创建不存在的文件。根据:使用默认编码和缓冲区大小,为指定路径上的指定文件初始化StreamWriter类的新实例。如果文件存在,则可以将其覆盖或附加到。如果文件不存在,此构造函数将创建一个新文件。当使用
using
关键字时,您不需要调用
sw.Close()
,它会自动处理。(这就是使用<代码>首先使用<代码>的全部意义)尽管检查是多余的,因此本质上会使事情变得更复杂。我个人不认为这样做。尽管它可能是多余的,但它使它更易于阅读、理解和调试。该代码对比赛条件有何规定?如果其他进程在文件创建后立即删除该文件,该怎么办?它容易在比赛条件下出错。StreamWriter必须正确创建文件。否则它就是.NET中的一个bug。