该进程无法访问该文件,因为它正在被使用(错误)

时间:2012-05-02 10:25:51

标签: c# .net visual-studio c#-4.0

我正在尝试将文本文件中的行向上移动一行,然后将其重写回原始文件,但由于某种原因而出现错误,似乎无法弄明白。

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++;
}

5 个答案:

答案 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);