Exemple #1
0
        private void DoWork()
        {
            bool isReportSetSignaled = false;

            if (File.Exists(mFileName))
            {
                using (BinaryReader sReader = new BinaryReader(new FileStream(mFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 100)))
                {
                    bool isEOF        = false;
                    long fromPosition = mFromPosition > StorageHeader.STORAGE_HEADER_SIZE ? mFromPosition : StorageHeader.STORAGE_HEADER_SIZE;
                    long toPosition   = mToPosition > 0 && mToPosition < sReader.BaseStream.Length ? mToPosition : sReader.BaseStream.Length;
                    long total        = toPosition - fromPosition;
                    long fileLength   = sReader.BaseStream.Length;
                    bool isPartial    = toPosition < sReader.BaseStream.Length;

                    ReadHeader(sReader, false);
                    sReader.BaseStream.Position = fromPosition;

                    ReportReset();
                    while (!isClosing)
                    {
                        if (!isEOF)
                        {
                            DataChunk dataChunk = DataChunk.ReadDataChunk(sReader);
                            if (dataChunk != null)
                            {
                                ReportReceiveData(dataChunk);
                            }
                            else
                            {
                                isEOF = true;
                            }

                            if (isPartial && sReader.BaseStream.Position > toPosition)
                            {
                                isEOF = true;
                            }

                            if (total > 0)
                            {
                                ProgressValue = (byte)((sReader.BaseStream.Position - fromPosition) * 100 / total);
                            }
                        }
                        else
                        {
                            ProgressValue = 100;
                            ReportSet();
                            isReportSetSignaled = true;
                            if (isPartial)
                            {
                                break;
                            }
                            while (!isClosing && isEOF)
                            {
                                Thread.Sleep(100);
                                long newFileLength = sReader.BaseStream.Length;
                                if (newFileLength < fileLength)
                                {
                                    fileLength = newFileLength;
                                    isEOF      = false;
                                    ReadHeader(sReader, false);
                                    ReportReset();
                                }
                                else if (newFileLength > fileLength)
                                {
                                    fileLength = newFileLength;
                                    isEOF      = false;
                                }
                            }
                        }
                    }
                }
            }

            IsOpen        = false;
            ProgressValue = 100;
            if (!isReportSetSignaled)
            {
                ReportSet();
            }
        }