public void Cut(string mFilePath, List <FilePiece> mQueeue) { using (var reader = new FileStream(mFilePath, FileMode.Open, FileAccess.Read)) { var counter = 0; long oldPs = 0; while (reader.Position < reader.Length) { var buffer = new byte[8]; //читаем заголовок файла reader.Read(buffer, 0, 8); //выбираем из прочитанного размер блока var compressedBlockLength = BitConverter.ToInt32(buffer, 4); //Console.WriteLine(compressedBlockLength); var comressedBytes = new byte[compressedBlockLength + 1]; buffer.CopyTo(comressedBytes, 0); reader.Read(comressedBytes, 8, compressedBlockLength - 8); var blockSize = BitConverter.ToInt32(comressedBytes, compressedBlockLength - 4); var decompressedBytes = ProcessUnPacking.ProcessArchive(comressedBytes, blockSize); mQueeue.Add(new FilePiece(counter, decompressedBytes)); counter++; long ps = reader.Position * 100 / reader.Length; if (ps != oldPs) { oldPs = ps; NotifyProgress?.Invoke(ps.ToString()); } } } }
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); } } }