2014-04-21 12 views
6

मुझे यकीन है कि हम सभी परिचित हैं और शायद सी # का उपयोग कर फ़ाइल पढ़ने में किताबों, ऑनलाइन इत्यादि में दिए गए कोड की पर्याप्त मात्रा का उपयोग करते हैं। कुछ के रूप में सरल ... जितना संक्षिप्तफ़ाइल का उन्नत पठन

StringBuilder fiContents = new StringBuilder(); 
using (StreamReader fi = new StreamReader(@"C:\a_file.txt")) 
{ 
    while (!fi.EndOfStream) 
    { 
     fiContents.Append(fi.ReadLine); 
    } 
} 

या हो सकता है कुछ ...

using (StreamReader fi = new StreamReader(@"C:\a_file.txt")) 
    fiContents.Append(fi.ReadToEnd()); 

अब चलो एक पल के लिए सुपर सैयान जाने के लिए और वास्तव में फैंसी चीजें करते की तरह एक BackgroundWorker है जो की अनुमति देगा जाने हम एक लोडिंग छवि दिखाते हैं (यह मैं क्या उपयोग करूंगा), एक प्रक्रिया उलटी गिनती टाइमर या ProgressBar प्रदान करें।

public void ReadFile(string filename) 
{ 
    BackgroundWorker procFile = new BackgroundWorker(); 
    // Progress 1: If we want to show the progress we need to enable the following property 
    // procFile.WorkerReportsProgress = true; 

    profile.DoWork += new DoWorkEventHandler((object obj, DoWorkEventArgs ev) => 
    { 
     StringBuilder fiContents = new StringBuilder(); 

     using (StreamReader fi = new StreamReader(filename)) 
     { 
      while (!fi.EndOfStream) 
      { 
       // Progress 2: Report the progress, this will be dealt with by the respective handler (below). 
       // procFile.ReportProgress((int)(fi.BaseStream.Length/fi.BaseStream.Position)/100); 

       fiContents.Append(fi.ReadLine); 
      } 
     } 

     ev.Result = fiContents; 
    } 

    /* Progress 3: The handler below will take care of updating the progress of the file as it's processed. 
    procFile.ProgressChanged += new ProgressChangedEventHandler((object obj, ProgressChangedEventArgs ev) => 
    { 
     // Progress 4: Do something with the value, such as update a ProgressBar. 
     // .... 
    } 
    */ 

    procFile.RunWorkerCompleted += new RunWorkerCompletedEventHandler((object obj, RunWorkerCompletedEventArgs ev) => 
    { 
     // Do something with the result (ev.Result), bearing in mind, it is a StringBuilder and the ev.Result is an object. 
     StringBuilder result = ev.Result as StringBuilder; 

     // .... 
    } 
} 

+++++ +++++ +++++ +++++ एक वार्म अप वास्तविक प्रश्न के लिए

समय ... ऊपर था और एक को दिखाने के लिए समझने का वर्तमान स्तर इसलिए मुझे इन्हें संभावित उत्तरों के रूप में नहीं सामना करना पड़ता है।

मैं ऊपर दिए गए अंतिम कोड उदाहरण को बहुत अधिक कर रहा हूं (यानी BackgroundWorker का उपयोग करके) और RichTextBox पर जो भी पढ़ा जाता है उसकी सामग्री को डंप कर रहा हूं। वास्तव में सरल सामान।

समस्या का सामना करना पड़ रहा है हालांकि बड़ी फाइलें (उदा। ~ 222 एमबी) प्रसंस्करण कर रही हैं। मामला सिर्फ एक .txt ले रहा है, इसे पढ़ रहा है, इसके परिणाम को StringBuilder के माध्यम से RichTextBox में बनाया गया है। यह फ़ाइल लोड नहीं कर सकता है, मुझे OutOfMemoryException मिलता है। इस के चारों ओर एक तरीका, जो काफी मात्रा में लेता है (और अभी भी फ़ाइल लोड नहीं करता है) स्ट्रिंग के माध्यम से पुनरावृत्ति कर रहा है और फ़ाइल StringBuilder फ़ाइल से प्रत्येक वर्ण (char के रूप में) जोड़ रहा है।

मैंने हमेशा फ़ाइलों को पढ़ने के सबसे बुनियादी और सीधा साधनों का उपयोग किया है (जैसे ऊपर दिए गए उदाहरण), लेकिन क्या किसी को इस पर सुधार करने के बारे में कोई मार्गदर्शन है? बेहद बड़ी फाइलों को संसाधित करने के तरीके? आदि

एक चर्चा टुकड़ा के रूप में भी, मैं आपके विचारों का स्वागत करता हूं।

+++++ +++++ +++++ +++++

संपादित करें 1 (@TaW): जब RichTextBox में string डाल करने के लिए कोशिश कर रहा अपवाद उत्पन्न हुआ था ...

FileProcessing.RunWorkerCompleted += new RunWorkerCompletedEventArgs((object obj, RunWorkerCompletedEventArgs e) => 
{ 
    // 'Code' is the RichTextBox in question... 

    Code.Text = ""; 

    if (e.Result is StringBuilder) 
    { 
     Code.Text = (e.Result as StringBuilder).ToString(); 
    } 
} 
+0

व्यक्तिगत रूप से, मैं बस 'File.ReadAllText (फ़ाइल नाम)' का उपयोग करता हूं लेकिन फिर मैं आलसी हूं। – Will

+0

संक्षिप्त उत्तर यह है कि एक फ़ाइल को लोड करने के लिए जो स्मृति के लिए बहुत बड़ा है, आप बस इसे एक साथ लोड नहीं कर सकते हैं। वर्तमान में स्क्रॉलिंग नियंत्रण में देखने वाली फ़ाइल का केवल एक हिस्सा लोड करना एक आम समाधान है। –

+1

200 एमबी फ़ाइल को पढ़ने में इतनी कम समय लगनी चाहिए कि प्रगति पट्टी और पृष्ठभूमि कार्यकर्ता अधिक हो गया है। –

उत्तर

0

, आप MemoryMapped की कोशिश की है
इसकी बड़ी फ़ाइलों

2

से निपटने के लिए बहुत उपयोगी lib वहाँ एक प्रतिबंध आपको लगता है कि यू करने की आवश्यकता है है है अपनी सामग्री को प्रदर्शित करने के लिए नियंत्रण के रूप में एक RichTextBox से? यह नियंत्रण वर्चुअलाइज्ड नहीं है और आपको प्रदर्शन (और इसे स्मृति त्रुटि के रूप में) मुद्दों का कारण बन जाएगा।

document viewing controls का एक परिवार है जो बड़े दस्तावेज़ों को प्रदर्शित करने के लिए बेहतर ढंग से डिज़ाइन किया गया है। आपकी आवश्यकताओं के आधार पर विभिन्न नियंत्रण मौजूद हैं (निश्चित, पृष्ठ या स्क्रॉलिंग के माध्यम से बहते हुए)। इसके अतिरिक्त, आपको खोज, प्रिंटिंग, ज़ूमिंग और कुछ अन्य सुविधाएं मिलती हैं जो अक्सर बड़े दस्तावेज़ देखने के लिए उपयोगी होती हैं।

+0

मैं वास्तव में एक स्क्रिप्ट संपादक (हाइलाइटिंग और इंटेलि-समझ के साथ) विकसित कर रहा हूं, जो अब पूर्ण हो गया है और एक रिचटेक्स्टबॉक्स की आवश्यकता है ताकि मैं हाइलाइटिंग और अन्य सुविधाओं को प्राप्त कर सकूं। तो वे सादा पाठ फाइलें होंगी। – user1092809

0

यह उन्नत पढ़ने के बारे में नहीं है बल्कि (विनफॉर्म) नियंत्रण की क्षमता सीमाओं को मारने के बारे में है। हो सकता है कि आप इसे WPF में काम करने के लिए प्राप्त कर सकें, लेकिन Winforms में न तो RichTextBox और न ही टेक्स्टबॉक्स में इतनी बड़ी लाइन/टेक्स्ट हो सकती है।

मैं आपको छोटे भागों में उपयोगकर्ताओं को डेटा पेश करने के लिए इसे फिर से डिजाइन करने की सलाह देता हूं। ऐसा नहीं है कि वे 100,000+ लाइनों के माध्यम से स्क्रॉल करना चाहते हैं। स्मृति में उन्हें संसाधित करना कोई मुद्दा नहीं है; यहां 200 एमबी बड़ा नहीं है; उदाहरण के लिए आप स्मृति आदि में आसानी से खोज सकते हैं ..

+0

प्रश्न जो मैंने देखा था, जबकि किसी समस्या के माध्यम से पूछा जा रहा था (जो वास्तव में WinForm नियंत्रण की सीमाएं थी), फाइल I/O में सी # और एक चर्चा के साथ और तकनीकें थीं। इसलिए मैंने कई तकनीकों का प्रदर्शन क्यों किया, उन तकनीकों का प्रदर्शन करने के लिए जिन्हें मैं परिचित हूं और संभवतः अन्य लोगों का क्या उपयोग होता है। मैं पूरी तरह से आपके दूसरे बिंदु से सहमत हूं। – user1092809

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