วิธีที่ง่ายที่สุด / บัญญัติในการสร้างไฟล์ว่างใน C # /. NET คืออะไร?
วิธีที่ง่ายที่สุดที่ฉันสามารถหาได้คือ:
System.IO.File.WriteAllLines(filename, new string[0]);
วิธีที่ง่ายที่สุด / บัญญัติในการสร้างไฟล์ว่างใน C # /. NET คืออะไร?
วิธีที่ง่ายที่สุดที่ฉันสามารถหาได้คือ:
System.IO.File.WriteAllLines(filename, new string[0]);
คำตอบ:
การใช้เพิ่งFile.Create
จะเปิดไฟล์ไว้ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
คุณสามารถใช้:
using (File.Create(filename)) ;
ดูแปลกไปเล็กน้อย คุณสามารถใช้เครื่องมือจัดฟันแทน:
using (File.Create(filename)) {}
หรือเพียงโทรDispose
โดยตรง:
File.Create(filename).Dispose();
ไม่ว่าจะด้วยวิธีใดหากคุณจะใช้งานในสถานที่มากกว่าหนึ่งแห่งคุณควรพิจารณาห่อด้วยวิธีการช่วยเหลือเช่น
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
โปรดทราบว่าโทรDispose
โดยตรงแทนการใช้using
คำสั่งไม่ได้จริงๆให้แตกต่างกันมากที่นี่เท่าที่ผมสามารถบอกได้ - วิธีเดียวที่จะสามารถสร้างความแตกต่างคือถ้าด้ายถูกยกเลิกระหว่างการเรียกและเรียกร้องให้File.Create
Dispose
ถ้าว่าสภาพการแข่งขันที่มีอยู่ผมสงสัยว่ามันจะยังมีอยู่ในusing
รุ่นถ้าด้ายถูกยกเลิกที่ปลายสุดของFile.Create
วิธีการก่อนค่าที่ถูกส่งกลับ ...
using (File.Create(filename)) ;
งานอยู่ แต่ฉันชอบความเรียบง่ายของFile.Create(filename).Dispose();
File.Create(filename).Dispose();
แทน
Close()
จะปล่อยทรัพยากรเช่นกัน Close()
เพียงแค่โทรDispose
- ดูgithub.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/ ......
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
หรือ
File.CreateText("path").Close();
File.WriteAllText(string, string)
การใช้"เข้ารหัส UTF-8 โดยไม่ต้องมาร์คลำดับไบต์ (BOM)" หากคุณยังคงเห็นข้อผิดพลาดหนึ่งนั่นอาจเป็นข้อผิดพลาดใน WriteAllText หรือเอกสารของมูลค่าการรายงาน
Encoding.UTF8
ส่งคืนตัวเข้ารหัสที่ส่งออก Byte Order Mark (BOM) คุณสามารถใช้new UTF8Encoding(false)
เพื่อรับตัวเข้ารหัส UTF8 ที่ไม่ส่งออก BOM
WriteAllText
แตกต่างจากรุ่นก่อนหน้าของ. NET หรือไม่ อย่างไรก็ตามเพื่อความแน่ใจเป็นพิเศษให้ข้ามส่วนการเข้ารหัสและใช้File.WriteAllBytes(path, new byte[] { });
แทน
System.IO.File.Create(@"C:\Temp.txt");
ตามที่คนอื่น ๆ ได้ชี้ให้เห็นคุณควรกำจัดวัตถุนี้หรือห่อไว้ในที่ว่างโดยใช้คำสั่ง
using (System.IO.File.Create(@"C:\Temp.txt"));
คุณสามารถโยงเมธอดออกจากอ็อบเจ็กต์ที่ส่งคืนดังนั้นคุณสามารถปิดไฟล์ที่คุณเพิ่งเปิดในคำสั่งเดียวได้ทันที
File.Open("filename", FileMode.Create).Close();
เพื่อหลีกเลี่ยงการเขียนทับไฟล์ที่มีอยู่โดยไม่ได้ตั้งใจ:
using (new FileStream(filename, FileMode.CreateNew)) {}
... และจัดการกับ IOException ซึ่งจะเกิดขึ้นหากไฟล์นั้นมีอยู่แล้ว
File.Create
ซึ่งมีคำแนะนำในคำตอบอื่น ๆ จะเขียนทับเนื้อหาของหากไฟล์นั้นมีอยู่แล้ว ในกรณีง่าย ๆ คุณสามารถลดการใช้นี้File.Exists()
ได้ อย่างไรก็ตามจำเป็นต้องมีบางสิ่งที่แข็งแกร่งกว่าในสถานการณ์ที่หลายเธรดและ / หรือกระบวนการพยายามสร้างไฟล์ในโฟลเดอร์เดียวกันพร้อมกัน
กรณีการใช้งานที่ค่อนข้างทั่วไปสำหรับการสร้างไฟล์ว่างเปล่าคือการกระตุ้นให้เกิดสิ่งอื่นที่เกิดขึ้นในกระบวนการที่แตกต่างกันหากไม่มีความซับซ้อนมากขึ้นในการสื่อสารกระบวนการ ในกรณีนี้มันสามารถช่วยให้การสร้างไฟล์เป็นอะตอมจากมุมมองของโลกภายนอก (โดยเฉพาะอย่างยิ่งถ้าสิ่งที่ถูกทริกเกอร์กำลังจะลบไฟล์เพื่อ "ทริกเกอร์" บริโภค)
ดังนั้นจึงสามารถช่วยในการสร้างชื่อขยะ (Guid.NewGuid.ToString ()) ในไดเรกทอรีเดียวกับไฟล์ที่คุณต้องการสร้างแล้วทำ File.Move จากชื่อชั่วคราวเป็นชื่อที่คุณต้องการ มิฉะนั้นรหัสที่ทริกเกอร์ซึ่งตรวจสอบการมีอยู่ของไฟล์และจากนั้นลบทริกเกอร์อาจทำงานในสภาพการแข่งขันที่ไฟล์ถูกลบก่อนที่จะปิดอย่างสมบูรณ์
การมีไฟล์ temp ในไดเรกทอรีเดียวกัน (และระบบไฟล์) จะช่วยให้คุณมีอะตอมมิกซิตี้ที่คุณอาจต้องการ มันให้อะไรทำนองนี้
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 () จะสร้างไฟล์ว่างชื่อ uniquly และส่งคืนพา ธ
ถ้าคุณต้องการควบคุมพา ธ แต่รับชื่อไฟล์แบบสุ่มคุณสามารถใช้ GetRandomFileName เพื่อส่งคืนสตริงชื่อไฟล์และใช้กับสร้าง
ตัวอย่างเช่น:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);