ফাইল.ক্রিয়েট () ব্যবহারের পরে অন্য প্রক্রিয়া দ্বারা ফাইল ব্যবহৃত হচ্ছে


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কন্সট্রাকটর ফাইলটি বিদ্যমান বিষয়বস্তু যোগ করা হবে কারণ হবে।


আমি উপরের কোডটি চেষ্টা করেছিলাম কিন্তু ফাইলটি তৈরি হওয়ার সময় আমি একই ত্রুটি পাচ্ছি এবং যখন এটি ফাইলটিতে লেখার চেষ্টা করে তখন ফাইলটি দেখায় যে অন্য প্রক্রিয়া দ্বারা ফাইলটি ব্যবহৃত হচ্ছে।
আনমল রাঠোদ

@ আনমোল রথোদ নিশ্চিত হন যে আপনি File.Create()পদ্ধতিটি ব্যবহার করবেন না ! উপরের স্নিপেট ইতিমধ্যে ফাইল তৈরি করে!
ড্যানিয়েল আইজেনেরিচ 15:25 এ

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

আমি এই উত্তরটি আপডেট করে বলতে চাই যে এটি সমস্ত পাঠ্য লেখার পক্ষে সবচেয়ে কার্যকর উপায় নয়। আপনার যদি দ্রুত এবং নোংরা কিছু দরকার হয় তবেই এই কোডটি ব্যবহার করা উচিত।

আমি যখন এই প্রশ্নের উত্তর দিয়েছিলাম তখন আমি একজন তরুণ প্রোগ্রামার ছিলাম এবং এরপরে আমি ভেবেছিলাম এই উত্তরটি নিয়ে আসার জন্য আমি একধরনের প্রতিভা।


4
আমি পছন্দ করি অন্য সমস্ত উত্তর কীভাবে খুব জটিল ছিল। লোকেরা বুঝতে পারে না যে প্রতিটি সমস্যার একটি সহজ উত্তর আছে।
কার্সন ড্যানিয়েল ইয়েটস

14
এই কোডের খারাপ দিকটি হ'ল এটি অযথা ফাইলটি দুবার খোলায়। এছাড়াও, ফাইলটি আদৌ বিদ্যমান কিনা তা খতিয়ে দেখার দরকার নেই, কারণ ফাইলস্ট্রিম নির্মাণকারীর অস্তিত্ব না থাকলে স্বয়ংক্রিয়ভাবে এটিকে আপনার জন্য তৈরি করে দেবে, যদি না আপনি স্পষ্টভাবে এটি না করতে বলে থাকেন।

2
@ রিরাব এটি সম্পূর্ণ আপেক্ষিক। ফাইলটি উপস্থিত আছে কিনা তা আমার পরীক্ষা করা দরকার এবং তা যদি হয় তবে এটি মুছে ফেলুন এবং এটি আবার তৈরি করুন, সুতরাং এই উত্তরটি আমার ক্ষেত্রে পছন্দ করা উচিত।
মাকোশিচি

1
@ এসও তাহলে আপনার ওপি থেকে আলাদা সমস্যা আছে, কেবল একটি সম্পর্কিত। এছাড়াও, আপনার ক্ষেত্রে, আপনি এখনও কেবল FileStream(string, FileMode)কনস্ট্রাক্টর ব্যবহার করতে পারেন এবং এটি ফাইলমোড.ক্রিয়েটটি পাস করতে পারেন যা কোনও বিদ্যমান ফাইলকে ওভাররাইট করে দেবে। তবুও দুবার ফাইল খোলার দরকার নেই। এছাড়াও, আমার উত্তরটি পোস্ট করার পরে এই উত্তরটি সম্পাদিত হয়েছিল।
রিয়ারাব

2
এই উত্তরের পয়েন্টটি হ'ল আপনি কেবল .Close()শেষে যুক্ত করতে পারেন তা দেখানো , তাই এটি যে কোনও ক্ষেত্রেই কার্যকর হয়। আমি FileStreamসমস্ত কিছুর জন্য ব্যবহারের সিস্টেমকে অবিশ্বস্ত করি কারণ FileMode.Createফাইলটি ইতিমধ্যে রয়েছে এমনটিতে আমি ব্যতিক্রম ঘটতে চাই না - বিশেষত যখন আমি বিষয়বস্তুগুলি সাফ করতে চাই এবং তার মাধ্যমে সংযোজন না করি FileMode.Open। আমার কাছে, FileStreamকেবলমাত্র প্রশ্নযুক্ত ফাইলটি পরিত্রাণ পাওয়ার পরে কাজ করে, তারপরে এটি লিখে। যেহেতু File.Createএটিকে উন্মুক্ত এবং লক করে রেখে .Close()চলেছে তাই এটি আমার দৃশ্যপট এবং এসও এর সাথে মোকাবিলা করার একমাত্র আসল উপায় হ'ল এটি যুক্ত করা।
vapcguy

25

একটি পাঠ্য ফাইল তৈরি করার সময় আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

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

আপনার মন্তব্য থেকে কোড ব্যবহার। আপনার তৈরি করা ফাইল (স্ট্রিম) অবশ্যই বন্ধ করতে হবে। ফাইল.সৃজন ফাইলটি কেবলমাত্র তৈরি করা ফাইলটিতে ফর্মটি ফেরত দিন:

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 
}

আমার কাছে খুব কাছের বিকল্প নেই বলে মনে হচ্ছে। এখানে কোডটি রয়েছে: স্ট্রিং ফাইলপথ = স্ট্রিং। ফর্ম্যাট (@ "{0} \ এম {1}। ড্যাট", কনফিগারেশন ম্যানেজার.অ্যাপসেটেটিংস ["ডিরেক্টরিপথ"], কস্টেনট্রে); যদি (! ফাইল.এক্সিস্টস (ফাইলপথ))। ফাইল.ক্রিয়েট (ফাইলপথ); } (স্ট্রিমউইটার sw = ফাইল.অ্যাপেন্ডটেক্সট (ফাইলপথ)) ব্যবহার করে {// আমার লেখাটি লিখুন Bret
ব্রেট

File.Createফিরে আসে FileStreamএবং তাClose()
নুল হেড

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

7
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। আপনার উত্তর / সমাধান বর্ণনা করার জন্য আপনার কমপক্ষে সংক্ষিপ্ত বিবরণ লিখতে হবে।
পরেশ মায়ানী

9

File.Create একটি ফাইল স্ট্রিম প্রদান করে। আপনি যখন ফাইলটি লিখেছেন তখন আপনাকে এটি বন্ধ করতে হবে:

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);এর প্রয়োগ হয়েছে।
huুকাস

1

আমি মনে করি আমি এই ব্যতিক্রমের কারণটি জানি। আপনি হয়ত এই কোড স্নিপেট একাধিক থ্রেডে চালাচ্ছেন।


আমার জন্য সমস্যাটি ছিল যে আমি অ্যাসিক্রোন পথে কোনও লগ ফাইল লিখি (ভিন্ন থ্রেডে: টাস্ক.আরুন () অপেক্ষা না করে (উদ্দেশ্য অনুসারে), এবং এটি একই ফাইলটিতে মাল্টিথ্রেড অ্যাক্সেসের কারণ হতে পারে
বেনস ভিগার্ট

-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
কল নিষ্পত্তি কল দ্বারা ফাইল বন্ধ হবে। আপনার স্যাম্পল ফাইলটিতে দুটিবার বন্ধ ছিল
ভ্যালেন্টাইন জখারেঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.