2013-10-29 47 views
1

我想要做的 - 有兩個嵌套for循環。 Outer生成字符串文件名並在文件名不存在時創建文件名,內部生成要寫入文件名的字符串。它將字符串附加到該文件名。這個過程爲我們想要的每個文件名重複。創建文件錯誤 - 正在使用文件?

我嘗試使用(部分代碼) -

string path = @"path here"; 
File.Create(path); 
StreamWriter file = new StreamWriter(path, true); 

outer for loop{ 
file.WriteLine(strMsg); 
} 

file.Close(); 

的文件被創建,但沒有數據被寫入到它,我得到一個錯誤 - 正在被另一個進程使用的文件「XYZ」。如何解決這個問題?

+1

請發佈完整的代碼示例。 – Dan

+0

@丹 - 沒有必要。 – Steam

回答

4

File.Create方法創建並打開該文件。您忽略FileStream返回值,這意味着它沒有被關閉。

當您然後嘗試打開文件StreamWriter時,它已打開,這將失敗。

在這種情況下,完全忽略File.CreateStreamWriter的構造函數將創建該文件爲您提供:

using(StreamWriter file = new StreamWriter(path, false)) 
{ 
    for // ... outer for loop 
    { 
     file.WriteLine(strMsg); 
    } 
} 
+0

謝謝。它工作正常 – Steam

0

File.Create返回一個FileStream,你所忽略。

也許更像這樣的東西?

using (FileStream fs = File.Create(path)) {} 

將允許您保持您的代碼,否則完好無損並解決該問題?

+0

爲什麼預先創建文件? –

+0

問原始海報....我只是發佈他的問題的答案,而不需要他完全重寫。我會按照你提到的方式或File.WriteAllText(fn,「」)來創建它。 – gap

3

您需要處置創建的流對象以釋放文件鎖定。特別是File.Create未處理,因此它仍然會對剛創建的文件保持鎖定。

string path = @"path here"; 
File.Create(name).Dispose(); // Kill the lock immediately. 
using (StreamWriter file = new StreamWriter(path, true)) 
{ 
outer for loop{ 
file.WriteLine(strMsg); 
} 
// Stream will close automatically when leaving the using block. 
+1

爲什麼即使使用File.Create? –

+0

感謝您向我展示替代方法。我的代碼不好,但它也有助於瞭解你的方法。 – Steam

+0

@ReedCopsey這不是一個完整的代碼示例。創建可能發生在其他地方,然後你可能想要寫入文件(我會使用File.WriteAllText)。如果你一直想要創建文件,這仍然是正確的,如果你只是想創建,如果你正在寫文件,那麼我想這是毫無意義的。 – BrutalDev