我正在尝试将文本文件中的行向上移动一行,然后将其重写回原始文件,但由于某种原因而出现错误,似乎无法弄明白。
using (StreamReader reader = new StreamReader("file.txt"))
{
string line;
int Counter = 0;
while ((line = reader.ReadLine()) != null)
{
string filepath = "file.txt";
int i = 5;
string[] lines = File.ReadAllLines(filepath);
if (lines.Length >= i)
{
string tmp = lines[i];
lines[i] = lines[i-1];
lines[i-1] = tmp;
File.WriteAllLines(filepath, lines);
}
}
Counter++;
}
答案 0 :(得分:5)
您正在打开要在此行中阅读的文件:
using (StreamReader reader = new StreamReader("file.txt"))
此时它已打开并正在使用。
然后,您稍后会:
string[] lines = File.ReadAllLines(filepath);
尝试从相同的文件中读取。
目前尚不清楚你想要达到的目标,但这不起作用。
从我所看到的情况来看,你根本不需要reader
。
答案 1 :(得分:0)
你试图打开文件来写它是在已经使用流读取器打开它的方法内,流阅读器打开它,文件编写器试图打开它但不能因为它已经打开,
答案 2 :(得分:0)
不要同时读写文件 1.如果文件很小,只需加载,更改文件并回写即可。 2.如果文件很大,只需打开另一个临时文件进行输出, 删除/删除第一个文件,然后重命名第二个文件。
答案 3 :(得分:0)
而不是:
using (StreamReader reader = new StreamReader("file.txt"))
{
...
string[] lines = File.ReadAllLines(filepath);
}
使用:
using (StreamReader reader = new StreamReader("file.txt"))
{
string line;
string[] lines = new string[20]; // 20 is the amount of lines
int counter = 0;
while((line=reader.ReadLine())!=null)
{
lines[counter] = line;
counter++;
}
}
这将读取文件中的所有行并将它们放入“行”。
您可以对代码的写入部分执行相同操作,但这种方式仅使用1个进程从文件中读取。它将读取所有行然后处理和关闭。
希望这有帮助!
答案 4 :(得分:0)
我认为你实际上想要交换文件中的每一行(?),因为这段代码片段:
string tmp = lines[i];
lines[i] = lines[i-1];
lines[i-1] = tmp;
所以这是一种应该有效的方法:
String[] lines = System.IO.File.ReadAllLines(path);
List<String> result = new List<String>();
for (int l = 0; l < lines.Length; l++)
{
String thisLine = lines[l];
String nextLine = lines.Length > l+1 ? lines[l + 1] : null;
if (nextLine == null)
{
result.Add(thisLine);
}
else
{
result.Add(nextLine);
result.Add(thisLine);
l++;
}
}
System.IO.File.WriteAllLines(path, result);
修改:这是稍微修改过的版本,它只与前一行交换一行,因为您已经评论过这是您的要求:
String[] lines = System.IO.File.ReadAllLines(path);
List<String> result = new List<String>();
int swapIndex = 5;
if (swapIndex < lines.Length && swapIndex > 0)
{
for (int l = 0; l < lines.Length; l++)
{
String thisLine = lines[l];
if (swapIndex == l + 1) // next line must be swapped with this
{
String nextLine = lines[l + 1];
result.Add(nextLine);
result.Add(thisLine);
l++;
}
else
{
result.Add(thisLine);
}
}
}
System.IO.File.WriteAllLines(path, result);