Как указано, DotNetZip - ваш друг. Распаковка вашего zip-файла так же просто, как
using ( ZipFile archive = new ZipFile( @"c:\path\to\your\password\protected\archive.zip",) )
{
archive.Password = "your-pass-word-here" ;
archive.Encryption = EncryptionAlgorithm.PkzipWeak ; // the default: you might need to select the proper value here
archive.StatusMessageTextWriter = Console.Out;
archive.ExtractAll( @"c:\path\to\unzip\directory\", ExtractExistingFileAction.Throw ) ;
}
По моему опыту, DotNetZip работает примерно так же быстро, как инфо-zip с открытым исходным кодом unzip и использует примерно тот же объем памяти.
Отредактировано для заметок: DotNetZip использовался для работы в Codeplex. Codeplex отключен. Старый архив все еще доступен в Codeplex . Похоже, что код перенесен в Github:
Эта версия делает то, что вы хотите:
with cte as (
select parobj as obj, convert(nvarchar(max), NULL) as path
from smth
where not exists (select 1 from smth smth2 where smth2.chilobj = smth.parobj)
union all
select smth.chilobj as obj, convert(nvarchar(max), coalesce(path + ' -> ', '')) + cte.obj
from cte join
smth
on cte.obj = smth.parobj
)
select obj, coalesce(path + ' -> ' + obj, 'Root')
from cte;
Здесь - db <> скрипка.