2013-02-08 28 views
5

Về cơ bản tôi muốn tạo tệp nếu không tồn tại, sau đó viết thư cho nó.Quá trình không thể truy cập tệp khi sử dụng StreamWriter

if (!File.Exists(filePath + fileName)) 
    File.Create(filePath + fileName); 
StreamWriter sr = new StreamWriter(filePath + fileName,false); 

Cách xử lý lỗi này?

Quy trình không thể truy cập tệp 'c: \ blahblah' vì quá trình này đang được sử dụng bởi một quy trình khác.

Trả lời

14

File.Create mở một FileStream (http://msdn.microsoft.com/en-us/library/d62kzs03.aspx).

Vì bạn không bỏ nó, tệp vẫn bị khóa và quyền truy cập tiếp theo vào tệp sẽ không thành công do tình huống này được thực hiện từ các tay cầm khác (ví dụ: FileStream hoặc toàn bộ StreamWriter).

Mã này chứng tỏ làm thế nào bạn nên làm việc với các đối tượng như IDisposableFileStream:

if (!File.Exists(filePath + fileName)) 
{ 
    File.Create(filePath + fileName).Dispose(); 

    using(StreamWriter sr = new StreamWriter(filePath + fileName,false)) 
    { 

    } 
} 
+2

Tại sao phải lo lắng với File.Create? Chỉ cần chuyển đường dẫn đến tệp tới hàm tạo của StreamWriter và tránh tạo đối tượng thừa mà bạn không sử dụng. –

+0

@ChrisDunaway Vâng, hoàn toàn, nhưng tôi đã trả lời "tại sao phần thứ hai không thể truy cập tệp?". Bạn biết. –

3

Tại sao không chỉ cần sử dụng constructor StreamWriter mà mất trong tên tập tin?

StreamWriter sr = new StreamWriter(filePath + fileName); 

Từ MSDN:

Tham số con đường có thể là một tên tập tin, bao gồm một tập tin trên một Universal Naming Convention (UNC) cổ phiếu. Nếu tệp tồn tại, tệp sẽ bị ghi đè; nếu không, một tập tin mới sẽ được tạo.

Điểm rất nhỏ nhưng bạn có thể cân nhắc sử dụng Path.Combine khi nối tên tệp và đường dẫn thư mục.

+0

Tôi có phải tạo nó trước và đảm bảo rằng nó tồn tại hay không? –

+0

Bạn đã đọc báo giá chưa? 'Nếu tệp tồn tại, nó sẽ bị ghi đè; nếu không, ** một tập tin mới sẽ được tạo **. ' –

2

Đơn giản hóa mã của bạn bằng cách sử dụng phương pháp duy nhất để tạo và mở một tập tin:

using (FileStream fs = File.OpenWrite(path)) 
{ 
    Byte[] info = new UTF8Encoding(true) 
         .GetBytes("This is to test the OpenWrite method."); 

    fs.Write(info, 0, info.Length); 
} 

MSDN: (File.OpenWrite Method)

Mở một tập tin hiện có hoặc tạo ra một tập tin mới cho văn bản.

+0

Điều này sẽ có nhiều upvotes hơn. – Rob

Các vấn đề liên quan