আমি কোনও পাঠ্য ফাইল লক না করে কীভাবে পড়তে পারি?


95

আমার কাছে একটি উইন্ডোজ পরিষেবা একটি সহজ ফর্ম্যাটে কোনও পাঠ্য ফাইলে তার লগ লিখেছে।

এখন, আমি পরিষেবার লগটি পড়ার জন্য একটি ছোট অ্যাপ্লিকেশন তৈরি করতে যাচ্ছি এবং বিদ্যমান লগ এবং যোগ করা লাইভ ভিউ হিসাবে উভয়ই দেখায়।

সমস্যাটি হ'ল পরিষেবাটি নতুন লাইন যুক্ত করার জন্য পাঠ্য ফাইলটি লক করে এবং একই সাথে দর্শকের অ্যাপ্লিকেশনটি ফাইলটি পড়ার জন্য লক করে।

পরিষেবা কোড:

void WriteInLog(string logFilePath, data)
{
    File.AppendAllText(logFilePath, 
                       string.Format("{0} : {1}\r\n", DateTime.Now, data));
}

দর্শকের কোড:

int index = 0;
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (StreamReader sr = new StreamReader(logFilePath))
                {
                    while (sr.Peek() >= 0)  // reading the old data
                    {
                        AddLineToGrid(sr.ReadLine());
                        index++;
                    }
                    sr.Close();
                }

                timer1.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


private void timer1_Tick(object sender, EventArgs e)
        {
            using (StreamReader sr = new StreamReader(logFilePath))
            {
                // skipping the old data, it has read in the Form1_Load event handler
                for (int i = 0; i < index ; i++) 
                    sr.ReadLine();

                while (sr.Peek() >= 0) // reading the live data if exists
                {
                    string str = sr.ReadLine();
                    if (str != null)
                    {
                        AddLineToGrid(str);
                        index++;
                    }
                }
                sr.Close();
            }
        }

আমার কোডে পড়া এবং লেখার পথে কোনও সমস্যা আছে?

কীভাবে সমস্যা সমাধান করবেন?


উত্তর:


122

আপনাকে নিশ্চিত করতে হবে যে পরিষেবা এবং পাঠক উভয়ই লগ ফাইলটি অ-একচেটিয়াভাবে খোলেন। এটা চেষ্টা কর:

পরিষেবাটির জন্য - আপনার উদাহরণের লেখক - নীচে FileStreamতৈরি করা একটি উদাহরণ ব্যবহার করুন :

var outStream = new FileStream(logfileName, FileMode.Open, 
                               FileAccess.Write, FileShare.ReadWrite);

পাঠকের জন্য একই ব্যবহার করুন তবে ফাইল অ্যাক্সেস পরিবর্তন করুন:

var inStream = new FileStream(logfileName, FileMode.Open, 
                              FileAccess.Read, FileShare.ReadWrite);

এছাড়াও, যেহেতু FileStreamপ্রয়োগগুলি IDisposableনিশ্চিত করে যে উভয় ক্ষেত্রেই আপনি কোনও usingবিবৃতি ব্যবহার করা বিবেচনা করছেন , উদাহরণস্বরূপ লেখকের জন্য:

using(var outStream = ...)
{
   // using outStream here
   ...
}

শুভকামনা!


এছাড়া ReadLines () সংস্করণ এ stackoverflow.com/questions/5338450/...
কলিন

পারফেক্ট - আমি ভেবেছিলাম ফাইলঅ্যাক্সেস সহ ফাইল.ওপেন () খুলুন e পড়া যথেষ্ট ছিল, তবে তা নয়। এটি যদিও। :)
নিমিনেম

লেখকের উপরে, ফাইলশেয়ার করা হবে না? কেবলমাত্র একজন লেখক থাকায় যথেষ্ট পড়ুন?
ক্রোকুসেক

4
এছাড়াও, FileStreamপ্রয়োগগুলি লক্ষণীয়IDisposable
সপ্তাহে দেবদেহ

28

স্পষ্টত টেক্সট ফাইলটি পড়ার সময় ভাগ করে নেওয়ার মোড সেট আপ করুন।

using (FileStream fs = new FileStream(logFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read,    
                                      FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs))
    {
        while (sr.Peek() >= 0) // reading the old data
        {
           AddLineToGrid(sr.ReadLine());
           index++;
        }
    }
}

4
স্ট্রিমরিডার হিসাবে স্পষ্টভাবে স্ট্রিমটি বন্ধ করা অপ্রয়োজনীয় is ডিসপোজ এটিকে স্বয়ংক্রিয়ভাবে বন্ধ করে দেয়।

4
আমি বিশ্বাস করি যে ফাইল ভাগ দুটি পড়া এবং লেখার স্ট্রিমে সেট করা উচিত, এবং কেবল পড়া নয়।
লাইভ

StreamReader.Dispose এছাড়াও FileStream এর মীমাংসা করে যদি আমি ভুল না। এখানে এটি দুবার নিষ্পত্তি হয়েছে।
এগ্রিথ

12
new StreamReader(File.Open(logFilePath, 
                           FileMode.Open, 
                           FileAccess.Read, 
                           FileShare.ReadWrite))

-> এটি ফাইলটি লক করে না।


4
ডেটা পড়ার সময় মনে হয় কাজ করার জন্য। লক করা ফাইল লেখার সময় ত্রুটি উঠে আসে।
ওয়েবজি

8

সমস্যাটি যখন আপনি লগতে লিখছেন তখন আপনি একচেটিয়াভাবে ফাইলটি লক করে রাখছেন যাতে আপনার স্ট্রিম রিডারটি একেবারেই খোলার অনুমতি পাবেন না।

আপনাকে কেবল পঠন মোডে ফাইলটি খোলার চেষ্টা করতে হবে।

using (FileStream fs = new FileStream("myLogFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs))
    {
        while (!fs.EndOfStream)
        {
            string line = fs.ReadLine();
            // Your code here
        }
    }
}

এখনই আমি জানি, File.ReadAllText()কেবল পঠন মোডে ব্যর্থ হয়।
বোহদান_ট্রোটসেনকো

@ মোডোসানস্রেভ হ্যাঁ আমি ডকস হিসাবে উত্তরের সেই অংশটি সরিয়ে দিয়েছি যে UnauthorizedAccessExceptionফাইলটি কেবল পঠন করলে এটি একটি নিক্ষেপ করবে - উত্তর দেওয়ার সময় অবশ্যই এটি মিস হয়ে গেছে!
জেমস

5

আমার মনে আছে কয়েক বছর আগে একই জিনিসটি করা। কিছু গুগল প্রশ্নের পরে আমি এটি পেয়েছি:

    FileStream fs = new FileStream(@”c:\test.txt”, 
                                   FileMode.Open, 
                                   FileAccess.Read,        
                                   FileShare.ReadWrite);

অর্থাত্ ফাইলস্ট্রিম ব্যবহার করুন। ফাইলস্ট্রিমে রিডরাইট বৈশিষ্ট্য ()।

( বালাজী রমেশের ব্লগে পাওয়া গেছে )


1

আপনি কি ফাইলটি অনুলিপি করার চেষ্টা করেছেন, তারপর এটি পড়ছেন?

যখনই বড় পরিবর্তনগুলি করা হয় কেবল অনুলিপি করুন।


4
আমি এটি চেষ্টা করেছি এবং এটি সেরা সমাধান নয়। ফাইলটি অনুলিপি করতে খুব বেশি সময় লাগে, 4 এমবি ফাইলের জন্য 20 সেকেন্ডের মতো লাগে।
Seichi

-1

এই পদ্ধতিটি আপনাকে কোনও পাঠ্য ফাইল দ্রুত এবং এটি লক না করে দ্রুত পড়তে সহায়তা করবে।

private string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

আশা করি এই পদ্ধতিটি আপনাকে সহায়তা করবে।


4
আমি যতদূর বুঝতে পেরেছি, এই পদ্ধতিটি একটি পুরো ফাইলটি স্ট্রিংয়ে পড়ে এবং ব্যতিক্রমগুলি গিলে ফেলে। ফাইল লক করার ক্ষেত্রে এটি কীভাবে সাহায্য করার কথা তা আমি দেখতে পাচ্ছি না।
ডিফল্ট লোকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.