Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.04 KB | None | 0 0
  1. public CompressionResult Compress(string originalFileName, string compressedFileName)
  2.         {
  3.             var builder = new CompressionResultBuilder(CompressionMode.Compress);
  4.            
  5.             _progress.Reset();
  6.  
  7.             var sw = Stopwatch.StartNew();
  8.  
  9.             try
  10.             {
  11.                 if (!File.Exists(originalFileName))
  12.                 {
  13.                     throw new OperationFailedException(ErrorCode.FileDoesNotExist);
  14.                 }
  15.  
  16.                 var fileName = compressedFileName.Split(Path.DirectorySeparatorChar).LastOrDefault();
  17.                 if (compressedFileName.Any(c => Path.GetInvalidPathChars().Contains(c)) ||
  18.                     string.IsNullOrEmpty(fileName) ||
  19.                     fileName.Any(c => Path.GetInvalidFileNameChars().Contains(c)))
  20.                 {
  21.                     throw new OperationFailedException(ErrorCode.InvalidFileName);
  22.                 }
  23.  
  24.                 using (var originalFile = new FileStream(originalFileName, FileMode.Open))
  25.                 using (var compressedFile = new FileStream(compressedFileName, FileMode.Create))
  26.                 {
  27.                     builder.SetInputFileInfo(originalFileName, originalFile.Length);
  28.                    
  29.                     Exception internalException = null;
  30.                     Action<Exception> onException = exception => internalException = exception;
  31.                
  32.                     using (var writer = CreateChunkWriter(compressedFile, CompressionMode.Compress, onException))
  33.                     using (var compressor = CreateCompressor(writer, Environment.ProcessorCount, CompressionMode.Compress, onException))
  34.                     {
  35.                         var buffer = new byte[ChunkSize];
  36.  
  37.                         var position = 0L;
  38.                         var readCount = originalFile.Read(buffer, 0, ChunkSize);
  39.                         while (readCount > 0)
  40.                         {
  41.                             if (internalException != null)
  42.                             {
  43.                                 writer.Cancel();
  44.                                 compressor.Cancel();
  45.                                
  46.                                 throw internalException;
  47.                             }
  48.                            
  49.                             compressor.Enqueue(new Chunk(position, buffer.Take(readCount).ToArray()));
  50.                             position = originalFile.Position;
  51.                             readCount = originalFile.Read(buffer, 0, ChunkSize);
  52.                    
  53.                             _progress.SetProgress(CalculateProgress(originalFile.Position, originalFile.Length));
  54.                             builder.SetOutputFileInfo(compressedFileName, compressedFile.Length);
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.             catch (Exception e)
  60.             {
  61.                 builder.SetException(e);
  62.             }
  63.            
  64.             builder.SetLeadTime(sw.Elapsed);
  65.            
  66.             return builder.Result;
  67.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement