Удалить последнюю строку StreamWriter? - PullRequest
2 голосов
/ 13 декабря 2011

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

Я нашел следующий код (на SO), который хорошо работает:

var lines = System.IO.File.ReadAllLines(pluginQmlFileName);
System.IO.File.WriteAllLines(pluginQmlFileName, lines.Take(lines.Length - 1).ToArray());

, но дело в том, что я не могу использовать его в своем разделе:

using (StreamWriter sw = new StreamWriter(pluginQmlFileName, true))
{
    [...]
}

.

Есть ли способ удалить последнюю строку в разделе using {} или мне нужно сохранить свой фактический код?

Ответы [ 5 ]

4 голосов
/ 13 декабря 2011

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

3 голосов
/ 13 декабря 2011

Вы можете просто удалить последнюю строку после прочтения во всех них:

var lines = System.IO.File.ReadLines(pluginQmlFileName);

// will need changing to remove from the array if using ReadAllLines instead of ReadLines
lines = lines.RemoveAt(lines.Count - 1);
1 голос
/ 11 октября 2015

это, похоже, работает и со мной:

// вы должны попытаться закрыть все открытые потоки этого файла, если таковые имеются, // если вы используете его внутри using (StreamWriter sw = .... ) {....} // попытки => sw.close(); // затем

FileStream fs = new FileStream(filePath , FileMode.Open, FileAccess.ReadWrite);
fs.SetLength(fs.Length - 1);
fs.Close();
1 голос
/ 13 декабря 2011

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

Поэтому необходимо использовать другой класс для чтения содержимого файла, а затем, поскольку Класс StreamWriter унаследован от Класс TextWriter , вы должны иметь возможность использовать WriteLine (строка) метод, но это не имеет смысла, так как у вас уже есть довольно хороший рабочий код.

// read all lines
// ...
var allExceptLast = lines.Take(lines.Length - 1);
foreach(var line in allExceptLast)
{
   writer.WriteLine(line);
}
0 голосов
/ 13 декабря 2011

Что ж, в приведенном выше коде lines фактически является массивом строк, так как ReadAllLines возвращает массив строк.

Вместо того, чтобы думать в терминах «удаления последней строки», я бы предпочел «не писать последнюю строку», так что вы могли бы сделать:

string[] lines = ...; // Note that I'm using an array here!

using (...)
{
    for (int i = 0; i < lines.Length; i++)
    {
        if (i < lines.Length-1 || !condition)
            sw.WriteLine(lines[i]);
    }
}

Это записывает все строки до второй последней строки. Последняя строка записывается только если условие ложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...