यदि मौजूद नहीं है तो एक .txt फ़ाइल बनाएँ, और यदि यह एक नई पंक्ति को जोड़ती है


161

मैं एक .txt फ़ाइल बनाना और उस पर लिखना चाहूँगा, और यदि फ़ाइल पहले से मौजूद है तो मैं बस कुछ और लाइनें जोड़ना चाहता हूँ:

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    File.Create(path);
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The very first line!");
    tw.Close();
}
else if (File.Exists(path))
{
    TextWriter tw = new StreamWriter(path);
    tw.WriteLine("The next line!");
    tw.Close(); 
}

लेकिन पहली पंक्ति हमेशा अधिलेखित लगती है ... मैं उसी पंक्ति पर लिखने से कैसे बच सकता हूं (मैं इसे लूप में उपयोग कर रहा हूं)?

मुझे पता है कि यह बहुत आसान बात है, लेकिन मैंने WriteLineपहले कभी इस पद्धति का इस्तेमाल नहीं किया । मैं C # से बिल्कुल नया हूं।


3
खबरदार कि यहाँ लगभग सभी उत्तर गलत हैं और दौड़ की स्थिति के अधीन हैं । याद रखें: if (file exists) { open file }सभी प्रोग्रामिंग भाषाओं में पैटर्न लगभग हमेशा गलत होता है! .NET के लिए समाधान File.Open(path, FileMode.Append, FileAccess.ReadWrite)उचित झंडे के साथ उपयोग करना है।
कॉमफरिक

"एक FileMode मान जो निर्दिष्ट करता है कि क्या कोई फ़ाइल मौजूद है यदि कोई मौजूद नहीं है, और यह निर्धारित करता है कि क्या मौजूदा फ़ाइलों की सामग्री को बरकरार रखा गया है या अधिलेखित किया गया है।" इसलिए यहाँ मैनुअल दृष्टिकोण के बजाय .net द्वारा किया गया। तो यह यहाँ गलत नहीं है, यह मैन्युअल रूप से की गई एक ही प्रक्रिया है। आप अयोग्य कह सकते हैं लेकिन गलत कहना मायने नहीं रखता।
बर्कर यूसर

अंतर यह है: File.Openआंतरिक रूप से एक WinAPI फ़ंक्शन को दर्शाता है (अगली टिप्पणी देखें) उम्मीद है कि दौड़ की स्थिति को रोक रहा है। यहां अधिकांश समाधान ऐसा नहीं करते हैं और स्पष्ट रूप से दौड़ की स्थिति के अधीन हैं।
कॉमफ्रीक

1
हालाँकि अस्तित्व की जाँच FileMode.Append द्वारा निर्धारित की जाती है .. और यह एक अस्तित्व जाँच के लिए निर्देशन करता है और फिर CreateFileA के साथ फ़ाइल बनाता है। फिर भी गलत कहना थोड़ा अतिवादी है, लेकिन आप इसे अक्षम कह सकते हैं। हमें यह भी नहीं भूलना चाहिए कि अस्तित्व की जाँच का उपयोग केवल लिखने / पढ़ने के लिए ही नहीं किया जा सकता है, इसका उपयोग अन्य मामलों के लिए भी किया जा सकता है, इसलिए नए शुरुआतकर्ताओं के लिए यह विषय यह समझने के लिए उपयोगी है कि यह कैसे काम करता है। हालाँकि यदि आप अपने द्वारा लिखी गई सभी परिभाषाओं सहित एक उत्तर जोड़ सकते हैं और इसका कारण यह है कि यह बेहतर है जो उत्तर के रूप में बहुत मदद करेगा और संभवतः सही के रूप में चुना जाएगा।
बर्क युसेर

1
@ कॉम मैं पूरी तरह से सहमत हूं कि आपको इसे स्पष्ट रूप से समझाने के लिए इसके बारे में एक पूर्ण उत्तर लिखना चाहिए। टिप्पणियां जवाब देने के लिए नहीं हैं, और मैं इन दौड़ स्थितियों के बारे में पूरी तरह से उत्सुक हूं और आप इसे हल करने का प्रस्ताव कैसे देते हैं।
Matthieu Foltzer

जवाबों:


167

सही कंस्ट्रक्टर का उपयोग करें :

else if (File.Exists(path))
{
    using(var tw = new StreamWriter(path, true))
    {
        tw.WriteLine("The next line!");
    }
}

11
पहला उत्तर, सबसे सरल उत्तर, मेरे लिए सर्वाधिक उपयोगी उत्तर। जब मैंने इसे देखा तो मैं ऐसा था: हुह? सिर्फ "सच," जोड़ना काफी है? मैं कैसे आऊंगा कि पहले नहीं देखा? धिक्कार है ... मुझे लगा कि कुल गूंगा धन्यवाद। मैं वास्तव में इन थोड़े अच्छे उत्तरों को पसंद करता हूं।
बर्क युसेर

7
संकेत: यदि फ़ाइल मौजूद नहीं है, तो यह निर्माता एक नई फ़ाइल बनाता है।
अबू-एमिश

1
एक प्रयोग में मुझे लपेटो (नीचे जवाब देखें)।
डेविड थिएलेन

1
करीब बेमानी है, अगर आप का उपयोग किया है
माइकल फ्रीजिम

2
-1 यह दौड़ की स्थिति के अधीन है और गलत व्यवहार उत्पन्न कर सकता है! शायद बल्कि File.Open(path, FileMode.Append, FileAccess.ReadWrite)उस लौटे स्ट्रीम के माध्यम से फ़ाइल का आकार का उपयोग करें और जांचें।
कॉमफ्रीक

57
string path = @"E:\AppServ\Example.txt";
File.AppendAllLines(path, new [] { "The very first line!" });

File.AppendAllText () भी देखें। AppendAllLines प्रत्येक पंक्ति में एक नई पंक्ति जोड़ देगा, उसे स्वयं वहां रखे बिना।

यदि आपके पास मौजूद नहीं है तो दोनों विधियाँ फ़ाइल का निर्माण करेंगी।


3
मुझे लगता है कि उपयोगकर्ता जो पूछ रहा था, उसके लिए यह अधिक उपयुक्त है। ऐसा लगता है कि 2 मुद्दे हैं। 1 यह है कि पाठ ओवरराइट किया गया है - ऐसा इसलिए है क्योंकि WriteLine फाइल को ओवर राइट कर रहा है। इस मामले में, File.AppendAllText अधिक उपयुक्त है। और 2) - मैं अपनी फाइल कैसे बना सकता हूं और मुझे पता है कि मैं इसे कैसे जोड़ रहा हूं। यह जानने के लिए अच्छा है कि File.AppendAllText फ़ाइल बनाता है, यह मेरा सवाल था। StreamWriter हमेशा उपयुक्त नहीं होता है, यह इस बात पर निर्भर करता है कि उस एप्लिकेशन का उपयोग किस लिए किया जाता है। किसी भी मामले में यह मेरी मदद करता है। +1
डेविन सी

42
string path=@"E:\AppServ\Example.txt";

if(!File.Exists(path))
{
   File.Create(path).Dispose();

   using( TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The very first line!");
   }

}    
else if (File.Exists(path))
{
   using(TextWriter tw = new StreamWriter(path))
   {
      tw.WriteLine("The next line!");
   }
}

मेरे पास भी यही समस्या है, और इस पोस्टर को ढूंढें लेकिन इसमें समाधान मेरी समस्या का समाधान नहीं करता है। इसलिए मैं समाधान के कुछ टुकड़ों का उपयोग करता हूं और बस डिस्पोज () जोड़ता हूं। मेरा उद्देश्य कॉपी-पेस्ट को शामिल नहीं करता है।
अनिक

1
मैं यह नहीं सुझा रहा हूँ कि यह किया; मैं कह रहा हूं कि आपके उत्तर में शामिल किए बिना, मूल पोस्टर को यह नहीं पता होगा कि आपने जो बदलाव किए हैं या जो वे पूरा करने वाले हैं, उन्हें आपने क्यों बनाया है। पोस्ट करते समय हमेशा सभी प्रासंगिक जानकारी शामिल करें, ताकि लोगों को पता चल जाए कि आप क्या कर रहे हैं। :)
DiMono

1
यह काम करता है क्योंकि यह एक त्रुटि नहीं देता है जो कहता है कि आप नई बनाई गई फ़ाइल को नहीं लिख सकते क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है। .Dispose () कुंजी है। आपको बहुत - बहुत धन्यवाद!
GenXisT

यह किसी भी तरह से प्रश्न को संबोधित नहीं करता है, जो मौजूदा सामग्री को संरक्षित करने के बारे में है।
बेन वोइग्ट

Close()किसी usingबयान से कॉल करने का कोई मतलब नहीं है , क्योंकि स्वचालित रूप से निपटाने से पहले सभी संसाधन बंद हो जाएंगे।
शेरिडन

21

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

TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("The next line!");
tw.Close(); 

1
मैं स्वीकृत उत्तर के तर्क को काम करने की कोशिश कर रहा था, मुझे पता था कि मैंने पहले एक पंक्ति में ऐसा किया था, लेकिन सटीक वाक्यविन्यास याद नहीं कर सका। धन्यवाद।
मोरवेल

14

File.AppendAllText एक फ़ाइल में एक स्ट्रिंग जोड़ता है। यदि फ़ाइल मौजूद नहीं है तो यह एक टेक्स्ट फ़ाइल भी बनाता है। यदि आपको सामग्री पढ़ने की आवश्यकता नहीं है, तो यह बहुत ही कुशल है। उपयोग मामला लॉगिंग है।

File.AppendAllText("C:\\log.txt", "hello world\n");

यह सिर्फ वही है जिसकी मुझे आवश्यकता है, लेकिन मैं नई सामग्री को नई लाइन पर कैसे शुरू कर सकता हूं? मैं CSV फ़ाइलों का उपयोग कर रहा हूँ।
NiallUK

मुझे लगता है कि कोई सरल उपाय नहीं है। मैं आपको सुझाव दूंगा कि आप इस पोस्ट को देखें। stackoverflow.com/questions/1343044/…
R.Cha

6

आप बस "एपेंड" मोड में फ़ाइल खोलना चाहते हैं।

http://msdn.microsoft.com/en-us/library/3zc0w663.aspx


हाँ, यह भी उपयोगी है, लेकिन मैं एक तेज और सरल समाधान की तलाश कर रहा था और @ डैनियल हिलगर्थ के लिए धन्यवाद उसने उस दयालु समाधान को प्रदान किया। तो +1।
बर्क युसेर

3

जब आप StreamWriter शुरू करते हैं तो यह पहले ही पाठ को ओवरराइड कर देता है। आप जैसे अपेंडेंट प्रॉपर्टी का उपयोग कर सकते हैं:

TextWriter t = new StreamWriter(path, true);

3
 else if (File.Exists(path)) 
{ 
  using (StreamWriter w = File.AppendText(path))
        {
            w.WriteLine("The next line!"); 
            w.Close();
        }
 } 

1
यदि आपके पास 'ब्लॉक' का उपयोग कर रहा है, तो w.Close बेमानी है। ब्लॉक का उपयोग करने के अंत में निपटान वही करता है।
माइकल फ्रीजिम

-1 यह दौड़ की स्थिति के अधीन है और गलत व्यवहार उत्पन्न कर सकता है! शायद बल्कि File.Open(path, FileMode.Append, FileAccess.ReadWrite)उस लौटे स्ट्रीम के माध्यम से फ़ाइल का आकार का उपयोग करें और जांच करें।
कॉमफ्रीक


2

इसे इस्तेमाल करे।

string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The very first line!");
    }
}
else if (File.Exists(path))
{     
    using (var txtFile = File.AppendText(path))
    {
        txtFile.WriteLine("The next line!");
    }
}

निरर्थक File.AppendText(path), और इसके लिए जाँच करने की आवश्यकता नहीं है File.Exists(path)। और If (not A) Else If (A)एक अजीब इफ / एल्स है। मूल रूप से इस प्रश्न में कोई अच्छी बात नहीं है, कोई स्पष्टीकरण कोड नहीं है जो अन्य उत्तर का एक अनावश्यक संस्करण है।
xdtTransform

-1 यह दौड़ की स्थिति के अधीन है और गलत व्यवहार उत्पन्न कर सकता है! शायद बल्कि File.Open(path, FileMode.Append, FileAccess.ReadWrite)उस लौटे स्ट्रीम के माध्यम से फ़ाइल का आकार का उपयोग करें और जांच करें।
कॉमफ्रीक

2

आप बस File.AppendAllText () विधि का उपयोग कर सकते हैं यह आपकी समस्या को हल करेगा। यह विधि फ़ाइल निर्माण का ध्यान रखेगी यदि उपलब्ध नहीं है, तो फ़ाइल को खोलना और बंद करना।

var outputPath = @"E:\Example.txt";
var data = "Example Data";
File.AppendAllText(outputPath, data);

1

माइक्रोसॉफ़्ट डॉक्यूमेंटेशन से, आप मौजूद नहीं होने पर फ़ाइल बना सकते हैं और इसे सिंगल कॉल में जोड़ सकते हैं। File.AppendAllText Method (String, String)

.NET फ्रेमवर्क (वर्तमान संस्करण) अन्य संस्करण

किसी फ़ाइल को खोलता है, निर्दिष्ट स्ट्रिंग को फ़ाइल में जोड़ता है, और फिर फ़ाइल को बंद कर देता है। यदि फ़ाइल मौजूद नहीं है, तो यह विधि एक फ़ाइल बनाती है, निर्दिष्ट स्ट्रिंग को फ़ाइल में लिखती है, फिर फ़ाइल को बंद कर देती है। नामस्थान: System.IO असेंबली: mscorlib (mscorlib.dll में)

सिंटैक्स C # C ++ F # VB सार्वजनिक स्थैतिक शून्य AppendAllText (स्ट्रिंग पथ, स्ट्रिंग सामग्री) पैरामीटर पथ प्रकार: System.String फ़ाइल को निर्दिष्ट स्ट्रिंग को जोड़ने के लिए। सामग्री प्रकार: System.String स्ट्रिंग को फ़ाइल में जोड़ने के लिए।

AppendAllText


1
using(var tw = new StreamWriter(path, File.Exists(path)))
{
    tw.WriteLine(message);
}

आम तौर पर, उत्तर बहुत अधिक सहायक होते हैं यदि वे इस बात का स्पष्टीकरण शामिल करते हैं कि कोड क्या करने का इरादा है, और क्यों यह दूसरों को पेश किए बिना समस्या को हल करता है।
टिम डाइकमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.