मान लिया जाये कि तुम यहाँ एक धारा से पढ़ रहे हैं एक (गैर सही) कैसे करना है के उदाहरण है ... मूल रूप से प्रोग्रेसस्ट्रीमवापर फ़ाइल स्ट्रीम को लपेटता है और जब भी स्थिति बदल जाती है तो एक ईवेंट उठाता है।
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Reading big file...");
FileStream fileStream = File.OpenRead("c:\\temp\\bigfile.xml");
ProgressStreamWrapper progressStreamWrapper = new ProgressStreamWrapper(fileStream);
progressStreamWrapper.PositionChanged += (o, ea) => Console.WriteLine((double) progressStreamWrapper.Position/progressStreamWrapper.Length * 100 + "% complete");
XmlReader xmlReader = XmlReader.Create(progressStreamWrapper);
while (xmlReader.Read())
{
//read the xml document
}
Console.WriteLine("DONE");
Console.ReadLine();
}
}
public class ProgressStreamWrapper : Stream, IDisposable
{
public ProgressStreamWrapper(Stream innerStream)
{
InnerStream = innerStream;
}
public Stream InnerStream { get; private set; }
public override void Close()
{
InnerStream.Close();
}
void IDisposable.Dispose()
{
base.Dispose();
InnerStream.Dispose();
}
public override void Flush()
{
InnerStream.Flush();
}
public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
{
return InnerStream.BeginRead(buffer, offset, count, callback, state);
}
public override int EndRead(IAsyncResult asyncResult)
{
int endRead = InnerStream.EndRead(asyncResult);
OnPositionChanged();
return endRead;
}
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
{
return InnerStream.BeginWrite(buffer, offset, count, callback, state);
}
public override void EndWrite(IAsyncResult asyncResult)
{
InnerStream.EndWrite(asyncResult);
OnPositionChanged(); ;
}
public override long Seek(long offset, SeekOrigin origin)
{
long seek = InnerStream.Seek(offset, origin);
OnPositionChanged();
return seek;
}
public override void SetLength(long value)
{
InnerStream.SetLength(value);
}
public override int Read(byte[] buffer, int offset, int count)
{
int read = InnerStream.Read(buffer, offset, count);
OnPositionChanged();
return read;
}
public override int ReadByte()
{
int readByte = InnerStream.ReadByte();
OnPositionChanged();
return readByte;
}
public override void Write(byte[] buffer, int offset, int count)
{
InnerStream.Write(buffer, offset, count);
OnPositionChanged();
}
public override void WriteByte(byte value)
{
InnerStream.WriteByte(value);
OnPositionChanged();
}
public override bool CanRead
{
get { return InnerStream.CanRead; }
}
public override bool CanSeek
{
get { return InnerStream.CanSeek; }
}
public override bool CanTimeout
{
get { return InnerStream.CanTimeout; }
}
public override bool CanWrite
{
get { return InnerStream.CanWrite; }
}
public override long Length
{
get { return InnerStream.Length; }
}
public override long Position
{
get { return InnerStream.Position; }
set
{
InnerStream.Position = value;
OnPositionChanged();
}
}
public event EventHandler PositionChanged;
protected virtual void OnPositionChanged()
{
if (PositionChanged != null)
{
PositionChanged(this, EventArgs.Empty);
}
}
public override int ReadTimeout
{
get { return InnerStream.ReadTimeout; }
set { InnerStream.ReadTimeout = value; }
}
public override int WriteTimeout
{
get { return InnerStream.WriteTimeout; }
set { InnerStream.WriteTimeout = value; }
}
}
आप इन फ़ाइलों को किसी डोम/डेटाबेस या किसी अन्य चीज़ में कहां लोड कर रहे हैं? क्या आप नोड द्वारा उन्हें नोड पढ़ रहे हैं और उन्हें प्रोसेस कर रहे हैं या उन्हें स्मृति में डाल रहे हैं? – A9S6
मुझे लगता है कि मैं कुछ जानकारी डालना भूल जाता हूं: मैं इन एक्सएमएल फाइलों को एक एपीआई के लिए लोड करता हूं (मेरे पास स्रोत है, लेकिन मैं तर्क/पार्सिंग को संपादित नहीं करना पसंद करता हूं) जो फ़ाइल को पार्स (मुख्य रूप से एक्सपैथ के साथ) को पार्स करता है। यह एपीआई XML पैरामीटर में एक XML फ़ाइल (और XmlReader का उपयोग करें) या स्ट्रीम के लिए एक पथ में स्वीकार करता है। मुझे वास्तव में पार्सिंग प्रक्रिया की परवाह नहीं है जो जल्दी है, केवल स्मृति प्रक्रिया में लोडिंग पर ध्यान केंद्रित करता है। – camous
एक्सएमएल रीडर XPath का समर्थन नहीं करता है, और केवल सीरियल एक्सेस प्रदान करता है ... यदि आपको अधिक परिष्कृत प्रसंस्करण करने की आवश्यकता है, तो आप XPathNaviator का उपयोग करना चाहेंगे, या यदि स्मृति उपयोग महत्वपूर्ण है, तो vtd-xml –