我知道当我们使用StreamWriter时,根据定义,这是写入的,但事实是,在某些时候我有义务删除我的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 {}
部分的最后一行,还是必须保留我的实际代码?
答案 0 :(得分:4)
我不认为StreamWriter允许你这样做,但也许你可以制作自己的流包装器来实现这种行为?也就是说,它会将最后一行保留在内存中,只有在另一行进入时才写出来。
答案 1 :(得分:3)
您可以在读完所有内容后删除最后一行:
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);
答案 2 :(得分:1)
否则您无法从StreamWriter打开的流中删除任何数据。 StreamWriter旨在写入文件,因此您无法显式删除任何内容。
所以必须使用其他类来读取文件内容,然后从StreamWriter class继承TextWriter class,你应该可以使用WriteLine(string)方法,但这样做没有意义已经有一个非常好的工作代码。
// read all lines
// ...
var allExceptLast = lines.Take(lines.Length - 1);
foreach(var line in allExceptLast)
{
writer.WriteLine(line);
}
答案 3 :(得分:1)
这似乎与我合作:
//你必须尝试关闭该文件的所有打开流(如果有的话)
//如果你在using (StreamWriter sw = .... ) {....}
内使用它
// attempt => sw.close();
//然后
FileStream fs = new FileStream(filePath , FileMode.Open, FileAccess.ReadWrite);
fs.SetLength(fs.Length - 1);
fs.Close();
答案 4 :(得分:0)
好吧,在上面的代码中,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]);
}
}
这会将所有行写到最后一行。仅当条件为假时才写入最后一行。
答案 5 :(得分:0)
这就是我要解决的问题:
StreamWriter myFile = new StreamWriter(fileName, false);
int countLines = 0;
foreach (var line in lines)
{
countLines++;
if (countLines == lines.Count)
{
//Write doesn't insert "/r/n" on the end of line
myFile.Write(line.ToString());
}
else
{
//WriteLine insert "/r/n" on the end of a line
myFile.WriteLine(line.ToString());
}
}