private void CutPath(object o) { // индекс потока int index = (int)o; // файл, чтобы складывать все с потока var filePath = AppPropertiesSingle.GetInstance().TempPath; var tempFileName = index + Path.GetRandomFileName(); filePath = Path.Combine(filePath, tempFileName); // позиция курсора и конец отрезка в зависимости от идекса потока long cursorPos = m_StreamLength * index; long endPos = cursorPos + m_StreamLength; using (var reader = new BinaryReader(new FileStream(m_FilePath, FileMode.Open, FileAccess.Read))) { long BUFFER_SIZE = (long)AppPropertiesSingle.GetInstance().m_BufferSize; // для расчета прогресса long counter = 0; long oldPs = 0; // создаем файлик для записи using (var bw = new BinaryWriter(new FileStream(filePath, FileMode.Create))) { while (reader.BaseStream.Position < reader.BaseStream.Length) { long offset = cursorPos + counter * BUFFER_SIZE; var ps = (offset - cursorPos) * 100 / (endPos - cursorPos); if (ps != oldPs) { m_ProgressList[index] = ps; } if (offset > endPos) { break; } reader.BaseStream.Seek(offset, SeekOrigin.Begin); var bufferSize = BUFFER_SIZE; var nextoffset = cursorPos + (counter + 1) * BUFFER_SIZE; if (nextoffset > endPos) { bufferSize = (int)(endPos - offset); } var arBytes = reader.ReadBytes((int)bufferSize); // заархивируем считанный кусочек var compBytes = ProcessPacking.ProcessArchive(arBytes); bw.Write(compBytes); counter++; } } m_ThreadPieceList[index] = new FilePiece(filePath); } }
private void CutPath(object o) { // индекс потока int index = (int)o; var inList = m_AnchorListThread[index]; // файл, чтобы складывать все с потока var filePath = AppPropertiesSingle.GetInstance().TempPath; var tempFileName = index + Path.GetRandomFileName(); filePath = Path.Combine(filePath, tempFileName); using (var reader = new FileStream(m_FilePath, FileMode.Open, FileAccess.Read)) { // для расчета прогресса long counter = 0; long oldPs = 0; // создаем файлик для записи using (var bw = new BinaryWriter(new FileStream(filePath, FileMode.Create))) { foreach (var anchor in inList) { // считаем порцию байт (найдем размер порции и саму её по якорям) reader.Seek(anchor, SeekOrigin.Begin); var buffer = new byte[8]; reader.Read(buffer, 0, 8); var compressedBlockLength = BitConverter.ToInt32(buffer, 4); var comressedBytes = new byte[compressedBlockLength + 1]; buffer.CopyTo(comressedBytes, 0); reader.Read(comressedBytes, 8, compressedBlockLength - 8); var blockSize = BitConverter.ToInt32(comressedBytes, compressedBlockLength - 4); // разархивируем файл var uncompressedBytes = ProcessUnPacking.ProcessArchive(comressedBytes, blockSize); // запишем во временный файл bw.Write(uncompressedBytes); // расчет прогресса counter++; long ps = counter * 100 / inList.Count; if (ps != oldPs) { m_ProgressList[index] = ps; } } m_ThreadPieceList[index] = new FilePiece(filePath); } } }