Cách đơn giản / kinh điển nhất để tạo một tệp trống trong C # /. NET là gì?
Cách đơn giản nhất tôi có thể tìm thấy cho đến nay là:
System.IO.File.WriteAllLines(filename, new string[0]);
Cách đơn giản / kinh điển nhất để tạo một tệp trống trong C # /. NET là gì?
Cách đơn giản nhất tôi có thể tìm thấy cho đến nay là:
System.IO.File.WriteAllLines(filename, new string[0]);
Câu trả lời:
Sử dụng chỉ File.Create
để lại các tập tin 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ỳ lạ, nhớ bạn. Bạn có thể sử dụng niềng răng thay thế:
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 sẽ sử dụng điều này ở nhiều nơi, có lẽ bạn nên xem xét việc bọc nó trong một phương thức 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 using
câu lệnh không thực sự tạo ra nhiều khác biệt ở đây theo như tôi có thể nói - cách duy nhất có thể tạo ra sự khác biệt là nếu chuỗi bị hủy bỏ giữa cuộc gọi đến File.Create
và cuộc gọi đến Dispose
. Nếu điều kiện chủng tộc đó tồn tại, tôi nghi ngờ nó cũng sẽ tồn tại trong using
phiên bản, nếu luồng bị hủy bỏ ở cuối File.Create
phương thức, ngay trước khi giá trị được trả về ...
using (File.Create(filename)) ;
, nhưng tôi yêu sự đơn giản củaFile.Create(filename).Dispose();
File.Create(filename).Dispose();
thay vì.
Close()
cũng sẽ phát hành các tài nguyên. Close()
chỉ cần gọi Dispose
- xem github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/ trộm
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
hoặc là
File.CreateText("path").Close();
File.WriteAllText(string, string)
sử dụng "mã hóa UTF-8 mà không có Dấu thứ tự (BOM)" . Nếu bạn vẫn thấy một lỗi, đó sẽ là một lỗi trong WriteAllText hoặc tài liệu đáng báo cáo.
Encoding.UTF8
trả về một bộ mã hóa xuất ra Dấu thứ tự Byte (BOM). Bạn có thể sử dụng new UTF8Encoding(false)
để có được bộ mã hóa UTF8 không xuất BOM.
WriteAllText
thực sự hành xử khác nhau trong phiên bản .NET trước. Tuy nhiên, để chắc chắn hơn, chỉ cần bỏ qua phần mã hóa và sử dụng File.WriteAllBytes(path, new byte[] { });
thay thế.
System.IO.File.Create(@"C:\Temp.txt");
Như những người khác đã chỉ ra, bạn nên loại bỏ đối tượng này hoặc bọc nó trong một câu lệnh trống bằng cách sử dụng.
using (System.IO.File.Create(@"C:\Temp.txt"));
Để tránh vô tình ghi đè một tập tin hiện có, hãy sử dụng:
using (new FileStream(filename, FileMode.CreateNew)) {}
... và xử lý 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 đè lên nội dung nếu tệp đã tồn tại. Trong 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 các tình huống trong đó nhiều luồng và / hoặc các tiến trình đang cố gắng tạo các tệp trong cùng một thư mục.
Một trường hợp sử dụng khá phổ biến để tạo một tệp trống là để kích hoạt một cái gì đó khác xảy ra trong một quy trình khác trong trường hợp không tinh vi hơn trong giao tiếp quy trình. Trong trường hợp này, việc tạo tệp có thể là nguyên tử theo quan điểm của thế giới bên ngoài (đặc biệt nếu điều được kích hoạt sẽ xóa tệp để "tiêu thụ" trình 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 thư mục với tệp bạn muốn tạo, sau đó thực hiện File.Move từ tên tạm thời sang tên bạn muốn. Mặt khác, mã được kích hoạt để kiểm tra sự tồn tại của tệp và sau đó xóa kích hoạt có thể chạy trong điều kiện cuộc đua trong đó tệp bị xóa trước khi nó bị đóng hoàn toàn.
Có tệp tạm thời trong cùng thư mục (và hệ thống tệp) mang lại cho bạn tính nguyên tử mà bạn có thể muốn. Điều này cho một cái gì đó như.
public void CreateEmptyFile(string path)
{
string tempFilePath = Path.Combine(Path.GetDirectoryName(path),
Guid.NewGuid.ToString());
using (File.Create(tempFilePath)) {}
File.Move(tempFilePath, path);
}
Path.GetTempFileName () sẽ tạo một tệp trống có tên duy nhất và trả về đường dẫn đến nó.
Nếu bạn muốn kiểm soát đường dẫn nhưng lấy tên tệp ngẫu nhiên, bạn có thể sử dụng GetRandomFileName để chỉ trả về chuỗi tên tệp và sử dụng nó với Tạo
Ví dụ:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);