2015-06-09 8 views
0

У меня есть сжатый файл .bz2, и я хочу скопировать внутренний файл в другое место без его распаковки. Я использую .net 4.5 с C#.C# Как получить файл/скопировать файл из файла bzip2 (.bz2) без извлечения файла

я попытался, как это, но это для архивных файлов (.zip):

using (var zip = ZipFile.Read(_targetPathComplete + "\\" + file[0].ToUpper() + "_" + file[1].ToUpper() + ".bz2")) 
{ 
    Stream s = zip[file[0].ToUpper() + "_" + file[1].ToUpper()].OpenReader(); 
    // fiddle with stream here 

    using (var fileStream = File.Create(_targetPathComplete + "\\" + file[0].ToUpper() + "_" + file[1].ToUpper() + ".HDC")) 
    { 
     s.Seek(0, SeekOrigin.Begin); 
     s.CopyTo(fileStream); 
    } 
} 

Или сжать файл с помощью алгоритма bzip2 и дать расширение .HDC к нему.

+0

Поскольку это сжатый файл, кажется маловероятным извлечь из него что-либо из него без дефрагментации в первую очередь. Возможно [это] (http://stackoverflow.com/questions/14774401/how-to-list-the-first-or-last-10-lines-from-a-file-without-decompressing-it-in-l) помогает. – Melvin

+0

, если вы открываете вручную с помощью winrar и копируете файл оттуда, он также не распаковывается или не работает? – Tommek

ответ

0

Я думаю, что я решил это так, по крайней мере, у файла, который у меня есть, этот метод такой же, как при копировании файла из winrar.

var fname = _targetPathComplete + "\\" + file[0].ToUpper() + "_" + file[1].ToUpper() + ".bz2"; 
using (var fs = File.OpenRead(fname)) 
{ 
    using (var decompressor = new Ionic.BZip2.BZip2InputStream(fs)) 
    { 
     var outFname = _targetPathComplete + "\\" + file[0].ToUpper() + "_" + file[1].ToUpper() + ".HDC"; 
     using (var output = File.Create(outFname)) 
     { 
      var buffer = new byte[2048]; 
      int n; 
      while ((n = decompressor.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, n); 
      } 
     } 
    } 
}