File.Create () का उपयोग करने के बाद फ़ाइल को किसी अन्य प्रक्रिया द्वारा उपयोग किया जा रहा है


117

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

प्रक्रिया 'myfile.ext' फ़ाइल तक नहीं पहुँच सकती क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
if (!File.Exists(filePath)) 
{ 
    File.Create(filePath); 
} 

using (StreamWriter sw = File.AppendText(filePath)) 
{ 
    //write my text 
}

यह कैसे तय करें पर कोई विचार है?

जवाबों:


112

File.Createविधि फ़ाइल बनाता है और एक को खोलता है FileStreamफ़ाइल पर। तो आपकी फाइल पहले से ही खुली हुई है। आपको वास्तव में फ़ाइल की आवश्यकता नहीं है। बिलकुल सही तरीके से बनाएँ:

string filePath = @"c:\somefilename.txt";
using (StreamWriter sw = new StreamWriter(filePath, true))
{
    //write to the file
}

StreamWriterयदि फ़ाइल मौजूद है तो कंस्ट्रक्टर में बूलियन को जोड़ा जा सकता है।


मैंने उपरोक्त कोड की कोशिश की, लेकिन फ़ाइल बनाते समय मुझे वही त्रुटि हो रही है और जब यह फ़ाइल में लिखने की कोशिश करता है तो यह दिखाता है कि फ़ाइल अन्य प्रक्रिया द्वारा उपयोग की जा रही है।
अनमोल राठौड़

@AnmolRathod सुनिश्चित करें कि आप File.Create()विधि का उपयोग नहीं करते हैं ! ऊपर वाला स्निपेट पहले से ही फाइल बनाता है!
डैनियल ईसेनरिच

138
    File.Create(FilePath).Close();
    File.WriteAllText(FileText);

मैं इस उत्तर को यह कहने के लिए अद्यतन करना चाहता हूं कि यह वास्तव में सभी पाठ लिखने का सबसे कुशल तरीका नहीं है। आपको इस कोड का उपयोग केवल तभी करना चाहिए जब आपको किसी त्वरित और गंदे की आवश्यकता हो।

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


4
मैं प्यार करता हूँ कि कैसे अन्य सभी जवाब बहुत जटिल थे। लोगों को एहसास नहीं है कि हर समस्या का एक सरल जवाब है।
कारसेन डैनियल येट्स

14
इस कोड के लिए नकारात्मक पक्ष यह है कि यह अनावश्यक रूप से फ़ाइल को दो बार खोलता है। इसके अलावा, यह जांचना भी आवश्यक नहीं है कि फ़ाइल सभी में मौजूद है, क्योंकि फाइलस्ट्रीम कंस्ट्रक्टर स्वचालित रूप से आपके लिए इसे बना देगा यदि यह मौजूद नहीं है, जब तक कि आप स्पष्ट रूप से ऐसा नहीं करने के लिए कहेंगे।
रीहैब

2
@reirab यह पूरी तरह से सापेक्ष है। मुझे यह जांचने की आवश्यकता है कि क्या फ़ाइल मौजूद है और यदि यह है, तो इसे हटा दें और इसे फिर से बनाएं, इसलिए मेरे मामले में यह उत्तर पसंद किया जाता है।
मकोशिची

1
@ इसके अलावा आपके पास ओपी से अलग एक समस्या है, बस एक संबंधित। इसके अलावा, आपके मामले में, आप अभी भी FileStream(string, FileMode)कंस्ट्रक्टर का उपयोग कर सकते हैं और इसे FileMode.Create पास कर सकते हैं , जो किसी भी मौजूदा फ़ाइल को अधिलेखित कर देगा। फिर भी दो बार फाइल खोलने की जरूरत नहीं है। साथ ही, इस उत्तर को संपादित करने के बाद मैंने अपनी मूल टिप्पणी पोस्ट की।
रीहैब

2
इस उत्तर का मतलब यह दिखाना है कि आप .Close()अंत में जोड़ सकते हैं , इसलिए यह किसी भी मामले में काम करता है। मैं FileStreamसब कुछ के लिए उपयोग करने की प्रणाली को अविश्वास करता हूं क्योंकि मैं नहीं चाहता कि उस पर अपवाद हो FileMode.Create, फ़ाइल पहले से ही है - खासकर जब मैं सामग्री को साफ करना चाहता हूं और उनके माध्यम से नहीं जोड़ना चाहता FileMode.Open। मेरे लिए, FileStreamकेवल प्रश्न में फ़ाइल से छुटकारा पाने के बाद ही काम करता है, फिर इसे लिखना। चूंकि File.Createयह खुला और लॉक छोड़ रहा है, इसलिए लगता .Close()है कि यह मेरे परिदृश्य और एसओ से निपटने का एकमात्र वास्तविक तरीका है।
vapcguy 17

25

पाठ फ़ाइल बनाते समय आप निम्न कोड का उपयोग कर सकते हैं:

System.IO.File.WriteAllText("c:\test.txt", "all of your content here");

अपनी टिप्पणी से कोड का उपयोग करना। आपके द्वारा बनाई गई फ़ाइल (स्ट्रीम) बंद होनी चाहिए। File.Create फाइल को अभी बनाई गई फाइल में लौटाएं ।:

string filePath = "filepath here";
if (!System.IO.File.Exists(filePath))
{
    System.IO.FileStream f = System.IO.File.Create(filePath);
    f.Close();
}
using (System.IO.StreamWriter sw = System.IO.File.AppendText(filePath))
{ 
    //write my text 
}

मैं एक करीबी विकल्प नहीं लगता। यहाँ कोड है: string filePath = string.Format (@ "{0} \ M {1}। Dat", configurationManager.AppSettings ["DirectoryPath"], costCentre); if ((File.Exists (filePath)) {File.Create (filePath); } का उपयोग कर (StreamWriter sw = File.AppendText (filePath)) {// मेरा पाठ लिखें}
ब्रेट

File.Createरिटर्न FileStreamऔर वह हैClose()
Null Head

15
FileStream fs= File.Create(ConfigurationManager.AppSettings["file"]);
fs.Close();

7
Stackoverflow में आपका स्वागत है। आपको अपने उत्तर / समाधान का वर्णन करने के लिए कम से कम विवरण लिखना चाहिए।
परेश मेयानी

9

File.Create एक FileStream देता है। आपको उस समय बंद करना होगा जब आपने फ़ाइल में लिखा हो:

using (FileStream fs = File.Create(path, 1024)) 
        {
            Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");
            // Add some information to the file.
            fs.Write(info, 0, info.Length);
        }

आप फ़ाइल को स्वचालित रूप से बंद करने के लिए उपयोग कर सकते हैं।


हालांकि ओपी एक खोलने की कोशिश कर रहा StreamWriterहै, लेकिन उसके उपयोग से अनुमान लगाया जा सकता है File.AppendText
बिंकी

8

मैंने कोड स्निपेट के साथ आपके प्रश्न को अपडेट किया। उचित इंडेंटिंग के बाद, यह तुरंत स्पष्ट हो जाता है कि समस्या क्या है: आप उपयोग File.Create()करते हैं, लेकिन इसे बंद नहीं करते हैं FileStream

ऐसा करना अनावश्यक है, StreamWriterपहले से ही किसी मौजूदा फ़ाइल को जोड़ने और एक नई फ़ाइल बनाने की अनुमति देता है अगर यह अभी तक मौजूद नहीं है। ऐशे ही:

  string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre); 
  using (StreamWriter sw = new StreamWriter(filePath, true)) {
    //write my text 
  }

जो इस StreamWriterकंस्ट्रक्टर का उपयोग करता है ।


1

यह प्रश्न पहले ही उत्तर दिया जा चुका है, लेकिन यहां एक वास्तविक विश्व समाधान है जो यह जांचता है कि क्या निर्देशिका मौजूद है और पाठ फ़ाइल मौजूद होने पर संख्या को अंत में जोड़ता है। मैंने इसे एक विंडोज सेवा पर दैनिक लॉग फाइल बनाने के लिए उपयोग किया है जो मैंने लिखा था। मुझे उम्मीद है इससे किसी को सहायता मिलेगी।

// How to create a log file with a sortable date and add numbering to it if it already exists.
public void CreateLogFile()
{
    // filePath usually comes from the App.config file. I've written the value explicitly here for demo purposes.
    var filePath = "C:\\Logs";

    // Append a backslash if one is not present at the end of the file path.
    if (!filePath.EndsWith("\\"))
    {
        filePath += "\\";
    }

    // Create the path if it doesn't exist.
    if (!Directory.Exists(filePath))
    {
        Directory.CreateDirectory(filePath);
    }

    // Create the file name with a calendar sortable date on the end.
    var now = DateTime.Now;
    filePath += string.Format("Daily Log [{0}-{1}-{2}].txt", now.Year, now.Month, now.Day);

    // Check if the file that is about to be created already exists. If so, append a number to the end.
    if (File.Exists(filePath))
    {
        var counter = 1;
        filePath = filePath.Replace(".txt", " (" + counter + ").txt");
        while (File.Exists(filePath))
        {
            filePath = filePath.Replace("(" + counter + ").txt", "(" + (counter + 1) + ").txt");
            counter++;
        }
    }

    // Note that after the file is created, the file stream is still open. It needs to be closed
    // once it is created if other methods need to access it.
    using (var file = File.Create(filePath))
    {
        file.Close();
    }
}

1

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मैं इसे इस तरह बाहर फेंकना चाहता हूं कि आप अभी भी उपयोग कर सकते हैं File.Create("filename")", बस .Dispose()इसे जोड़ दें।

File.Create("filename").Dispose();

इस तरह यह उपयोग करने के लिए अगली प्रक्रिया के लिए फ़ाइल बनाता है और बंद करता है।


1
File.Create(FilePath).Close();उपरोक्त उत्तर से this.Dispose(true); GC.SuppressFinalize((object) this);इसके कार्यान्वयन में है।
घुकास

1

मुझे लगता है कि मुझे इस अपवाद का कारण पता है। आप इस कोड स्निपेट को कई थ्रेड में चला रहे होंगे।


मेरे लिए समस्या यह थी कि मैं asyncron way (एक अलग थ्रेड में टास्क फाइल पर लिखता हूं: Task.Run () बिना प्रतीक्षा के (उद्देश्य पर), और यह एक ही फाइल के लिए मल्टीथ्रेड एक्सेस का कारण बनता है।
बेन्स वेर्गर्ट

-1

इसे आज़माएं: यह किसी भी स्थिति में काम करता है, अगर फ़ाइल मौजूद नहीं है, तो यह इसे बनाएगा और फिर इसे लिख देगा। और अगर पहले से ही मौजूद है, तो कोई समस्या नहीं है और इसे खुलेगा:

using (FileStream fs= new FileStream(@"File.txt",FileMode.Create,FileAccess.ReadWrite))
{ 
     fs.close();
}
using (StreamWriter sw = new StreamWriter(@"File.txt")) 
 { 
    sw.WriteLine("bla bla bla"); 
    sw.Close(); 
 } 

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