Вопрос

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

bool fileExists = File.Exists(filePath);

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

    writer.WriteLine("data");
}

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

Это было полезно?

Решение 2

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

Другие советы

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

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

Мог бы попробовать Файл.Открыть функция.Внизу есть хороший пример и список Режимы файлов FileMode.Добавить - это то, что вы хотели бы

Ваш код сработал для меня корректно..

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

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

    writer.WriteLine("data");
    writer.Flush();
}

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

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

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");
}

Ваш код работает у меня, после 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");
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top