StreamWriter - не добавляется в созданный файл - PullRequest
0 голосов
/ 20 июля 2009

Я использую объект StreamWriter для записи в файл, созданный конструктором или уже существующий. Если файл существует, он добавляет данные. Если нет, то он должен создать файл, а затем также добавить данные. Проблема состоит в том, что когда файл должен быть создан, конструктор StreamWriter создает файл, но не записывает в него никакие данные.

bool fileExists = File.Exists(filePath);

using (StreamWriter writer = new StreamWriter(filePath, true))
{
    if (!fileExists)
    {
        writer.WriteLine("start");
    }

    writer.WriteLine("data");
}

EDIT: Спасибо за ответы. Блок using заботится о закрытии писателя. Что касается других людей, которые говорят, что это работает для них, могу ли я предоставить вам какую-либо информацию для дальнейшей диагностики проблемы? Файл локализован по сети. Может ли это быть потенциальной проблемой. Периодически я получаю сообщения об ошибках «Не удалось найти часть пути ...» и «Указанное сетевое имя больше не доступно».

Ответы [ 6 ]

1 голос
/ 20 июля 2009

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

1 голос
/ 20 июля 2009

Код работает на моем компьютере. Можем ли мы знать, что содержит переменная filePath? Возможно, вы искали не тот файл ...

ОБНОВЛЕНИЕ: проблема с сетью? Может быть, кто-то что-то делал на другой стороне сети. Попробуйте записать в локальный файл. Если это работает, попробуйте выполнить запись в удаленный файл в другом месте.

0 голосов
/ 20 июля 2009

Как и другие, кто писал, ваш код отлично работает на моем ПК.

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

try
{
    using (FileStream fs = new FileStream(filePath, FileMode.CreateNew))
    {
        using (StreamWriter sw = new StreamWriter(fs))
        {
            sw.WriteLine("start");
        }
    }
}
catch (IOException ex)
{
}

using (StreamWriter writer = new StreamWriter(filePath, true))
{
    writer.WriteLine("data");
}
0 голосов
/ 20 июля 2009

Можно попробовать функцию File.Open . Внизу есть хороший пример и список FileModes FileMode.Append - это то, что вы хотите

0 голосов
/ 20 июля 2009

Ваш код работал правильно для меня ..

Попробуйте использовать оператор

using (StreamWriter writer = new StreamWriter(filePath, true))
{
    if (!fileExists)
    {
        writer.WriteLine("start");
    }

    writer.WriteLine("data");
    writer.Flush();
}
0 голосов
/ 20 июля 2009

Ваш код работает для меня, после 3-х запусков я:

start
data
data
data

Вы уверены, что вы не пытаетесь получить доступ к файлу, что по какой-то причине вы не можете написать в него? Кроме того, просто чтобы убедиться, поместите writer.Close() перед утилизацией, хотя Dispose() должно сбрасывать данные. Если это не поможет, попробуйте создать файл вручную, используя File.Create() с соответствующими флагами.

// Изменить: Я пробовал этот код на моей машине:

public unsafe static void Main()
{
    string filePath = @"\\COMP-NAME\Documents\foo.txt";
    FileStream fs = null;
    if (!File.Exists(filePath))
        fs = File.Create(filePath);
    else
        fs = File.Open(filePath, FileMode.Append);

    using (StreamWriter writer = new StreamWriter(fs))
    {
        writer.WriteLine("data");
    }
}

И все идет гладко, можете попробовать это?

...