2009-04-29 39 views

Trả lời

315

Sử dụng chỉ File.Create sẽ để tệp mở, có thể không phải là những gì bạn muốn.

Bạn có thể sử dụng:

using (File.Create(filename)) ; 

Điều đó có vẻ hơi kỳ quặc, đầu óc bạn. Bạn có thể sử dụng niềng răng thay vì:

using (File.Create(filename)) {} 

Hoặc chỉ cần gọi Dispose trực tiếp:

File.Create(filename).Dispose(); 

Dù bằng cách nào, nếu bạn đang sử dụng này trong hơn một nơi bạn nên có thể xem xét gói nó trong một phương pháp trợ giúp, ví dụ

public static void CreateEmptyFile(string filename) 
{ 
    File.Create(filename).Dispose(); 
} 

Lưu ý rằng gọi Dispose trực tiếp thay vì sử dụng một tuyên bố using không thực sự làm cho nhiều khác biệt ở đây như xa như tôi có thể nói - cách duy nhất nó có thể tạo sự khác biệt là nếu các chủ đề đã được hủy bỏ giữa gọi tới số File.Create và gọi tới số Dispose. Nếu đó là tình trạng chủng tộc tồn tại, tôi nghi ngờ nó sẽ cũng tồn tại trong phiên bản using, nếu các chủ đề đã bị hủy bỏ vào cuối của phương pháp File.Create, ngay trước khi giá trị được trả về ...

+6

Hài hước. Tôi vừa viết mã tương tự khoảng 5 phút trước. Tôi đã làm File.Create (tên tệp) .Đóng(); Cùng một diff ... –

+2

Mã của tôi đang sử dụng 'using (File.Create (filename));', nhưng tôi thích sự đơn giản của 'File.Create (tên tệp) .Dispose();' – Vadim

+0

@BrianGenisio: Tôi vừa làm cùng một mã khoảng 5 phút trước! Tôi chỉ googled để xem làm thế nào các lập trình viên khác đã làm nó. Bây giờ tôi đang sử dụng 'File.Create (filename) .Dispose();' thay vì. – Jack

20
System.IO.File.Create(@"C:\Temp.txt"); 

Như những người khác đã chỉ ra, bạn nên xử lý đối tượng này hoặc bọc nó trong một tuyên bố sử dụng sản phẩm nào.

using (System.IO.File.Create(@"C:\Temp.txt")); 
+4

sẽ không xử lý đối tượng tốt hơn? ví dụ: sử dụng (System.IO.File.Create (filepath)) {} – kentaromiura

+0

@kentaromiura: Suy nghĩ của tôi chính xác, do đó câu trả lời của tôi :) –

+0

Điểm tốt cho mọi người. sẽ cập nhật orig. Chúc mừng. –

27
File.WriteAllText("path", String.Empty); 

hoặc

File.CreateText("path").Close(); 
+2

Sử dụng đầu tiên, tệp dài 3 byte: mã hóa. Sử dụng tệp thứ hai là 0 byte (thực sự trống). – Fil

+1

@Fil: Bạn có chắc chắn không? Tài liệu hướng dẫn nói] (https://msdn.microsoft.com/en-us/library/ms143375.aspx) rằng 'File.WriteAllText (chuỗi, chuỗi)' sử dụng * "mã hóa UTF-8 ** không có Thứ tự Byte Đánh dấu ** (BOM) "*. Nếu bạn vẫn thấy một, đó sẽ là một lỗi trong WriteAllText hoặc tài liệu của nó có giá trị báo cáo. – Heinzi

+0

Tôi nhớ tôi đã thử. Có lẽ đó là một lỗi cũ của phiên bản trước .Net? không trống nếu tôi chỉ định rõ ràng để sử dụng mã hóa UTF8 (hoặc unicode hoặc cái gì khác): Fil

0

Path.GetTempFileName() sẽ tạo ra một tập tin rỗng uniquly tên và trả lại đường dẫn đến nó.

Nếu bạn muốn kiểm soát con đường nhưng có được một tên tập tin ngẫu nhiên bạn có thể sử dụng GetRandomFileName để chỉ trả về một chuỗi tên tập tin và sử dụng nó với Tạo

Ví dụ:

string fileName=Path.GetRandomFileName(); 
File.Create("custom\\path\\" + fileName); 
+0

IMHO GetTempFileName() hoàn toàn bị đặt tên sai. –

+0

Tại sao câu trả lời này không hữu ích? – Crippledsmurf

+0

Nó không hữu ích vì hai lý do: 1. Câu hỏi không hỏi bất cứ điều gì về việc tạo ra một tên tập tin ngẫu nhiên, do đó, đó là một phân tâm. 2. Các tập tin không được đóng lại, có nghĩa là nếu bạn sau đó cố gắng mở một nhà văn tập tin, hoặc di chuyển các tập tin, nó sẽ thất bại. –

3

Bạn có thể phương pháp chuỗi tắt đối tượng được trả về, vì vậy bạn có thể đóng ngay lập tức tệp bạn vừa mở trong một câu lệnh.

File.Open("filename", FileMode.Create).Close(); 
2

Trường hợp sử dụng một cách phổ biến để tạo tệp trống là kích hoạt hoạt động khác trong quá trình giao tiếp quy trình phức tạp hơn. Trong trường hợp này, nó có thể giúp để tạo ra các tập tin được nguyên tử từ quan điểm của thế giới bên ngoài xem (đặc biệt là nếu điều được kích hoạt sẽ xóa các tập tin để "tiêu thụ" kích hoạt).

Vì vậy, nó có thể giúp tạo một tên rác (Guid.NewGuid.ToString()) trong cùng một thư mục với tệp bạn muốn tạo và sau đó thực hiện một tệp.Move từ tên tạm thời đến tên bạn muốn. Nếu không mã được kích hoạt để kiểm tra sự tồn tại của tập tin và sau đó xóa trình kích hoạt có thể chạy vào điều kiện cuộc đua, nơi tập tin bị xóa trước khi nó được đóng hoàn toàn.

Có tệp tạm thời trong cùng thư mục (và hệ thống tệp) cung cấp cho bạn tính nguyên tử bạn có thể muốn. Điều này cho một cái gì đó như thế.

public void CreateEmptyFile(string path) 
{ 
    string tempFilePath = Path.Combine(Path.GetDirectoryName(path), 
     Guid.NewGuid.ToString()); 
    using (File.Create(tempFilePath)) {} 
    File.Move(tempFilePath, path); 
} 
1

Để tránh vô tình ghi đè lên việc sử dụng tập tin hiện có:

using (new FileStream(filename, FileMode.CreateNew)) {} 

... và xử lý các IOException đó sẽ xảy ra nếu tệp đã tồn tại.

File.Create, được đề xuất trong các câu trả lời khác, sẽ ghi đè nội dung nếu tệp đã tồn tại. Trong những trường hợp đơn giản, bạn có thể giảm thiểu điều này bằng cách sử dụng File.Exists(). Tuy nhiên một cái gì đó mạnh mẽ hơn là cần thiết trong kịch bản mà nhiều chủ đề và/hoặc quy trình đang cố gắng để tạo ra các tập tin trong cùng một thư mục cùng một lúc.