2012-05-02 52 views
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++; 
} 
+3

嗯..我認爲你在這裏做的有點瘋狂......這個問題是你正在試圖寫入一個你已經在StreamReader中打開的文件。你明確想要做什麼?也許我們可以幫助你解決你的問題。 –

+0

可能會將所有文件內容存儲在數組或列表中。移動它們,然後將整個東西存回..沒有while循環 –

+0

你想交換文件中的每一行嗎? –

回答

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); 
+0

感謝您現在解決它 – user1285872

5

您打開的文件在這行改爲:

using (StreamReader reader = new StreamReader("file.txt")) 

在這一點上是開放的,被使用。

你的話,以後有:

string[] lines = File.ReadAllLines(filepath); 

試圖從同一文件中讀取。

目前尚不清楚你試圖達到什麼目標,但這是行不通的。

從我所看到的,你根本不需要reader

0

當你試圖打開該文件中寫入這是一個方法,多數民衆贊成內部已經在使用一個StreamReader打開它,流讀取器打開它,文件作家試圖打開它,但不能因爲它已經打開,

0

不要同時讀取和寫入文件 1.如果文件很小,只需加載,更改並回寫。 2.如果文件很大,只需打開另一個臨時文件輸出, 刪除/刪除第一個文件,然後重命名第二個文件。

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個進程從文件讀取。它將讀取所有行,然後處理並關閉。

希望這有助於!

相關問題