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; }