.NET

2010-03-03 4 views
9

में फ़ाइल सामग्री परिवर्तनों को पढ़ना लिनक्स में, 1 प्रक्रिया में फ़ाइल में संलग्न करके और दूसरी प्रक्रिया से नई सामग्री को पढ़कर बहुत सी आईपीसी की जाती है।.NET

मैं उपरोक्त विंडोज/.NET में करना चाहता हूं (पाइप के रूप में सामान्य आईपीसी का उपयोग करने के लिए बहुत गन्दा)। मैं एक पायथन प्रक्रिया से एक फाइल में शामिल हूं, और मैं परिवर्तनों को पढ़ना चाहता हूं और प्रत्येक बार फ़ाइलसिस्टम वाटर एक घटना की रिपोर्ट करता है। जब भी मैं परिवर्तन की तलाश में हूं, मैं पूरी फ़ाइल सामग्री को स्मृति में पढ़ना नहीं चाहता हूं (फ़ाइल बड़ी होगी)

प्रत्येक संलग्न ऑपरेशन डेटा की एक पंक्ति जोड़ता है जो एक अद्वितीय वृद्धि काउंटर (टाइमस्टैम्प + कुंजी) से शुरू होता है) और एक नई लाइन के साथ समाप्त होता है।

उत्तर

25
using (FileStream fs = new FileStream 
     (fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     using (StreamReader sr = new StreamReader(fs)) 
     { 
      while (someCondition) 
      { 
       while (!sr.EndOfStream) 
        ProcessLinr(sr.ReadLine()); 
       while (sr.EndOfStream) 
        Thread.Sleep(100); 
       ProcessLinr(sr.ReadLine());    
      } 
     } 
    } 

इस आप केवल संलग्न लाइनों

+0

परीक्षण किया गया, यह काम करता है। बहुत अच्छी तकनीक। –

+0

एक महान समाधान, छोटा और घातक! – MaYaN

9

पढ़ आप स्टोर कर सकते हैं पिछले पढ़ने आपरेशन के ऑफसेट और ऑफसेट है जब आप एक परिवर्तित फ़ाइल सूचना मिलती है कि करने के लिए फ़ाइल की तलाश में मदद मिलेगी। एक उदाहरण इस प्रकार है:

मुख्य विधि: फ़ाइल विधि से

public static void Main(string[] args) 
{ 
    File.WriteAllLines("test.txt", new string[] { }); 

    new Thread(() => ReadFromFile()).Start(); 

    WriteToFile(); 
} 

पढ़ें:

private static void ReadFromFile() 
{ 
    long offset = 0; 

    FileSystemWatcher fsw = new FileSystemWatcher 
    { 
     Path = Environment.CurrentDirectory, 
     Filter = "test.txt" 
    }; 

    FileStream file = File.Open(
     "test.txt", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.Write); 

    StreamReader reader = new StreamReader(file); 
    while (true) 
    { 
     fsw.WaitForChanged(WatcherChangeTypes.Changed); 

     file.Seek(offset, SeekOrigin.Begin); 
     if (!reader.EndOfStream) 
     { 
      do 
      { 
       Console.WriteLine(reader.ReadLine()); 
      } while (!reader.EndOfStream); 

      offset = file.Position; 
     } 
    } 
} 

लिखें विधि दायर करने के लिए:

private static void WriteToFile() 
{ 
    for (int i = 0; i < 100; i++) 
    { 
     FileStream writeFile = File.Open(
      "test.txt", 
      FileMode.Append, 
      FileAccess.Write, 
      FileShare.Read); 

     using (FileStream file = writeFile) 
     { 
      using (StreamWriter sw = new StreamWriter(file)) 
      { 
       sw.WriteLine(i); 
       Thread.Sleep(100); 
      } 
     } 
    } 
} 
+0

फ़ाइल ऑपरेशन की बात आती है जब मैं एक नोब का हूँ। क्या सबकुछ स्मृति में लोड करना चाहता है या क्या यह केवल ऑफसेट से ऑफ़सेट + लंबाई तक लोड होता है? – jameszhao00

+0

मेरे ज्ञान के लिए खोज ऑपरेशन किसी भी डेटा को लोड नहीं करेगा और केवल निर्दिष्ट स्थिति में फ़ाइल स्ट्रीम को स्थिति में रखेगा। इस मामले में स्थिति होगी जहां नया डेटा शुरू होता है। –

संबंधित मुद्दे