예제 #1
0
        public long FindPositionData(long StartPosition)
        {
            if (Scanner.MinDataLengthBytes == 0)
            {
                throw new Exception("Укажите данные поиска");
            }

            TailBytes.Clear();
            Scanner.BufferBytes.Clear();
            this.FileFilteredReadStream.Scanner.BufferBytes.Clear();

            long finded_position = -1;

            long original_position_of_stream = Position;

            long file_length = Length;

            long WorkingReadPosition = Position = StartPosition;

            while (WorkingReadPosition <= file_length || this.FileFilteredReadStream.Scanner.BufferBytes.Count > 0)
            {
                int this_byte = FileFilteredReadStream.ReadByte();
                AddToBuffer(this_byte);
                if (Scanner.ScanResult != null && Scanner.ScanResult.SuccessMatch)
                {
                    Position        = Position - Scanner.ScanResult.MatchUnit.GetDetectedSearchData().Length - this.FileFilteredReadStream.Scanner.BufferBytes.Count;
                    finded_position = Position;
                    break;
                }
                WorkingReadPosition++;
            }

            Position = original_position_of_stream;
            return(finded_position);
        }
        /// <summary>
        /// Копирует часть данных из файла в новый файл с произвольной точки до произвольной точки
        /// </summary>
        /// <param name="PointStart">Точка, с которой нужно копировать данные в новый файл</param>
        /// <param name="PointEnd">Точка, до которой нужно копировать данные в новый файл</param>
        public void CopyData(long StartPosition, long EndPosition, string destFileName)
        {
            // Запоминаем позицию курсора в файле, что бы потом вернуть его на место
            long current_position_of_stream = Position;

            //
            if (StartPosition < 0)
            {
                StartPosition = 0;
            }

            if (EndPosition > Length)
            {
                EndPosition = Length;
            }

            if (Length < 1 || StartPosition >= EndPosition)
            {
                return;
            }

            if (!Directory.Exists(Path.GetDirectoryName(destFileName)))
            {
                Directory.CreateDirectory(destFileName);
            }

            FileWriteStream = new FileStream(destFileName, FileMode.Create);

            int  markerFlush = 0;
            long ActualPoint = 0;

            Position = StartPosition;
            while (Position < EndPosition)
            {
                FileWriteStream.WriteByte((byte)FileFilteredReadStream.ReadByte());

                markerFlush++;
                if (markerFlush >= 20)
                {
                    FileWriteStream.Flush();
                    markerFlush = 0;
                    ProgressValueChange?.Invoke(((int)(ActualPoint / (Length / 100))));
                }
            }
            ProgressValueChange?.Invoke(((int)(ActualPoint / (Length / 100))));

            FileWriteStream.Close();
            Position = current_position_of_stream;
        }