예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                }
            }
        }