StreamWriter не записывает в файл, который не существует - PullRequest
3 голосов
/ 08 января 2012

Я делаю редактор уровней для своей игры, и большая часть его работает, кроме ... Когда я пытаюсь сохранить свой файл (XML), файл не создается, и в окне вывода я получаю:

A first chance exception of type 'System.NullReferenceException'

Самое смешное, что это происходит только в том случае, если файл не существует, но работает правильно, если я перезаписываю другой файл.

вот кодЯ использую:

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

data - строка (это не проблема, потому что она работает, когда я перезаписываю файл)

Ответы [ 4 ]

11 голосов
/ 08 января 2012

Вы пропустили конструктор , который принимает логическое значение, которое может помочь в создании файла:

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

На самом деле логика немного сложнее, чем это:

public StreamWriter( string path, bool append )

Определяет, должны ли данные добавляться в файл. Если файл существует и append false, файл перезаписан. Если файл существует и append is true, данные добавляются в файл. В противном случае создается новый файл.

3 голосов
/ 08 января 2012

Почему бы вам просто не обойти это простым способом и проверить существование файла перед записью в него:

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 удаляет его после того, как он выполнил свою задачу.

1 голос
/ 09 февраля 2017

В моем случае я запускал программу без прав администратора, файл должен был быть записан в папку, созданную с правами администратора (даже внутри ProgramFiles или в любом месте без прав администратора). Файл никогда не создается, и вы должны вручную включить разрывы исключений Managed Debugging Assistants, чтобы увидеть любую ошибку.

Решением было удалить папку и создать ее заново с моей учетной записью без прав администратора. Также обратите внимание, что StreamWriter не создает деревья каталогов, только файлы.

0 голосов
/ 08 января 2012

Вы пытались не использовать File.Create ()? вот так:

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