C # SharpZipLib удаляет ненужные имена каталогов - PullRequest
3 голосов
/ 29 августа 2009

Я использую SharpZipLib , чтобы заархивировать папку с подкаталогами, и это работает нормально. Я хотел бы удалить родительские каталоги первого дочернего файла, чтобы вся несущественная структура не была выполнена ...

Пример:

C: \ A \ B \ C \ D \ е \ Г \ \ ч \ file1.txt

C: \ A \ B \ C \ D \ е \ Г \ \ ч \ file2.txt

C: \ A \ B \ C \ D \ е \ Г \ \ ч \ г \ file1.txt

C: \ A \ B \ C \ D \ е \ Г \ \ ч \ г \ file2.txt

Это должно закончиться так:

file1.txt

file2.txt

я \ FILE1.TXT

я \ file2.txt

Как я могу это сделать?

Вот код, который у меня есть:

        ZipFile zipFile = new ZipFile(destinationArchive);

        zipFile.BeginUpdate();
        foreach (FileInfo file in sourceFiles)
        {
            zipFile.Add(file.FullName);
        }
        zipFile.CommitUpdate();

        zipFile.Close();

Ответы [ 2 ]

2 голосов
/ 29 августа 2009

Вместо этого используйте ZipOutputStream:

string[] sourceFiles = new [] { @"c:\a\b\c\d\e\f\g\h\file1.txt", @"c:\a\b\c\d\e\f\g\h\i\file1.txt" };
FileStream fileStream = File.Create(@"c:\temp\test.zip");
ZipOutputStream zipOut = new ZipOutputStream(fileStream);
string baseDir = @"c:\a\b\c\d\e\f\g\h\";
foreach (var sourceFile in sourceFiles)
{
    ZipEntry entry = new ZipEntry(sourceFile.Replace(baseDir,""));
    zipOut.PutNextEntry(entry);

    FileStream inFile =  File.OpenRead(sourceFile);
    byte[] buffer = new byte[8192];
    int bytesRead = 0;
    while ((bytesRead = inFile.Read(buffer, 0, buffer.Length)) > 0)
    {
        zipOut.Write(buffer,0,bytesRead);
    }
    zipOut.CloseEntry();                
}
zipOut.Close();
1 голос
/ 28 сентября 2009

Или посмотрите на CodePlex для DotNetZip.

...