C # में एक खाली फ़ाइल बनाना


186

C # /। NET में एक खाली फ़ाइल बनाने का सबसे सरल / विहित तरीका क्या है?

अब तक का सबसे सरल तरीका है:

System.IO.File.WriteAllLines(filename, new string[0]);

जवाबों:


384

बस का उपयोग करके 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मूल्य वापस किए जाने से ठीक पहले विधि के अंत में थ्रेड का गर्भपात किया गया था ...


8
मजेदार। मैंने लगभग 5 मिनट पहले वही कोड लिखा था। मैंने File.Create (फ़ाइल नाम) किया .Close (); समान अंतर ...
ब्रायन जेनिसियो

2
मेरा कोड उपयोग कर using (File.Create(filename)) ;रहा था , लेकिन मुझे सादगी पसंद हैFile.Create(filename).Dispose();
वादिम

@BrianGenisio: मैंने अभी भी लगभग 5 मिनट पहले एक ही कोड किया था! मैं सिर्फ यह देखने के लिए गया कि अन्य प्रोग्रामरों ने यह कैसे किया। अब मैं File.Create(filename).Dispose();इसके बजाय उपयोग कर रहा हूं ।
जैक

1
@ user3791372: Close()संसाधनों को भी जारी करेगा। Close()सिर्फ कॉल Dispose- देख github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/...
जॉन स्कीट

1
यह स्पष्ट नहीं हो सकता है कि यदि फ़ाइल पहले से मौजूद है, और केवल-पढ़ने के लिए नहीं है, तो फ़ाइल सामग्री ओवरराइट की गई है। इससे बचने के लिए, उपयोग करेंusing (new FileStream(filename, FileMode.CreateNew)) { }
फिल हैसेलडेन

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

या

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

2
पहले का उपयोग करते हुए, फ़ाइल 3 बाइट्स लंबी होती है: एन्कोडिंग कोड। दूसरी फ़ाइल का उपयोग करना 0 बाइट (वास्तव में खाली) का है।
Fil

1
@ फ़ील: क्या आपको यकीन है? प्रलेखन कहते हैं कि File.WriteAllText(string, string)का उपयोग करता है "UTF-8 एन्कोडिंग एक बाइट आदेश मार्क के बिना (BOM)" । यदि आप अभी भी एक को देखते हैं, तो वह WriteAllText या उसके प्रलेखन के लायक रिपोर्टिंग में एक बग होगा।
हेंजी

मुझे याद है मैंने कोशिश की है। शायद यह पिछले .Net संस्करण का एक पुराना बग था? फ़ाइल खाली नहीं है यदि मैं स्पष्ट रूप से UTF8 एन्कोडिंग (या यूनिकोड या कुछ और) का उपयोग करने के लिए निर्दिष्ट करता हूं: <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8)
fil

1
@ फ़ील, Encoding.UTF8एक एनकोडर देता है जो बाइट ऑर्डर मार्क (BOM) को आउटपुट करता है। आप new UTF8Encoding(false)UTF8 एनकोडर प्राप्त करने के लिए उपयोग कर सकते हैं जो BOM आउटपुट नहीं करता है।
डैनियल क्रैबट्री

1
पता नहीं क्या WriteAllTextवास्तव में .NET के पिछले संस्करण में अलग व्यवहार करता है। हालाँकि, अतिरिक्त सुनिश्चित होने के लिए, केवल एन्कोडिंग भाग को छोड़ें और File.WriteAllBytes(path, new byte[] { });इसके बजाय उपयोग करें ।
जुरगेन स्टीनब्लॉक

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

जैसा कि दूसरों ने बताया है, आपको इस वस्तु का निपटान करना चाहिए या इसे एक खाली उपयोग कथन में लपेटना चाहिए।

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

4
बेहतर वस्तु निपटान नहीं होगा? उदाहरण: (System.IO.File.Create (
फ़ाइलपथ

@kentaromiura: मेरे विचार बिल्कुल, इसलिए मेरा जवाब :)
जॉन स्कीट

4

आप लौटी हुई वस्तु से तरीकों को श्रृंखलाबद्ध कर सकते हैं, जिससे आप केवल एक बयान में आपके द्वारा खोली गई फ़ाइल को तुरंत बंद कर सकते हैं।

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

4

किसी मौजूदा फ़ाइल के उपयोग से गलती से बचने के लिए:

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

... और IOException को हैंडल करें जो तब होगा जब फ़ाइल पहले से मौजूद है।

File.Create, जो अन्य उत्तरों में सुझाया गया है, अगर फ़ाइल पहले से मौजूद है तो सामग्री को अधिलेखित कर देगा। साधारण मामलों में आप इसका उपयोग करके इसे कम कर सकते हैं File.Exists()। हालाँकि कुछ अधिक मजबूत परिदृश्यों में आवश्यक है जहाँ एक साथ एक ही फ़ोल्डर में कई थ्रेड और / या प्रक्रियाएँ फ़ाइल बनाने का प्रयास कर रही हैं।


2

खाली फ़ाइल बनाने के लिए कुछ हद तक सामान्य उपयोग का मामला प्रक्रिया संचार में अधिक परिष्कृत की अनुपस्थिति में एक अलग प्रक्रिया में हो रही कुछ और को ट्रिगर करना है। इस मामले में, यह फ़ाइल निर्माण को बाहरी दुनिया के दृष्टिकोण से परमाणु होने में मदद कर सकता है (विशेषकर यदि ट्रिगर की जा रही चीज़ फ़ाइल को ट्रिगर को "उपभोग" करने के लिए नष्ट करने जा रही है)।

तो यह उसी निर्देशिका में एक जंक नाम (Guid.NewGuid.ToString ()) बनाने में मदद कर सकता है जिस फ़ाइल को आप बनाना चाहते हैं, और फिर अस्थायी नाम से अपने इच्छित नाम के लिए एक File.Move करें। अन्यथा ट्रिगर कोड जो फ़ाइल अस्तित्व के लिए जाँच करता है और फिर ट्रिगर को हटा देता है दौड़ की स्थिति में चल सकता है जहां फ़ाइल पूरी तरह से बंद होने से पहले हटा दी जाती है।

उसी डायरेक्टरी (और फाइल सिस्टम) में टेंप फाइल होने से आपको वह एटमिटी मिल सकती है जो आप चाहते हैं। यह कुछ ऐसा देता है।

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

0

Path.GetTempFileName () खाली फ़ाइल नाम का एक uniquly बनाएगा और उस पर पथ लौटाएगा।

यदि आप पथ को नियंत्रित करना चाहते हैं, लेकिन एक यादृच्छिक फ़ाइल नाम प्राप्त करें, तो आप GetRandomFileName का उपयोग केवल एक फ़ाइल नाम स्ट्रिंग वापस करने और इसे बनाने के साथ कर सकते हैं

उदाहरण के लिए:

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

IMHO GetTempFileName () पूरी तरह से गलत है।
kay.herzam

वास्तव में यह उत्तर सहायक क्यों नहीं है?
Crippledsmurf

5
यह दो कारणों से अनपेक्षित है: 1. यह सवाल यादृच्छिक फ़ाइल नाम उत्पन्न करने के बारे में कुछ नहीं पूछता है, इसलिए यह एक विकर्षण है। 2. फ़ाइल बंद नहीं होती है, जिसका अर्थ है कि यदि आप बाद में किसी अन्य फ़ाइल लेखक को खोलने या फ़ाइल को स्थानांतरित करने का प्रयास करते हैं, तो यह विफल हो जाएगा।
नदी सत्य

मैं आपकी बातों को लेता हूं लेकिन: 1. सभी फाइलों के लिए नाम की जरूरत होती है। वह एक साधारण था। एक सुविधाजनक तरीका जो किसी भी चीज़ से टकराने की संभावना नहीं थी। 2. सवाल फ़ाइलों के निर्माण के बारे में पूछा गया था, जो कि प्रश्न में कोड, न्यूनतम रूप से, उसके बाद फ़ाइल का प्रबंधन कड़ाई से निर्माण का हिस्सा नहीं है, इसलिए मैंने इसे छोड़ दिया सादगी और सवाल का जवाब ध्यान में रखते हुए
Crippledsmurf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.