2012-04-05 1 views
2

Я пользуюсь библиотекой ICSharpCode.SharpZipLib.Zip;Использование подкаталога ICSharpCode.SharpZipLib.Zip в zip, когда его не должно быть

Мой код следующим образом:

  • Путь корня. \\ALAWP\\THIS\\ACORD\\
  • Я сжать их в ZIPDirectory

Однако, когда это делается файл не с именем acord_combined.txt, вместо этого он называется ACORD\acord_combined.txt

Что я делаю неправильно?

public void CleanRoot() 
{ 
    DirectoryInfo RootDi = new DirectoryInfo(FilePrep.RootDirectory); 
    string ZipDirectory = FilePrep.RootDirectory + "\\processed\\AceKey"+ DateTime.Now.ToString("yyyyMMdd_H;mm;ss") +".zip"; 

    ZipOutputStream NewZipOutput = new ZipOutputStream(File.Create(ZipDirectory)); 

    foreach (FileInfo fi in RootDi.GetFiles("acord*.*")) 
    { 
     Compress(ref NewZipOutput, fi); 
     //MoveFile(fi.FullName,ZipDirectory); 
    } 

    NewZipOutput.Finish(); 
    NewZipOutput.Close(); 
} 

public void Compress(ref ZipOutputStream ZipFolder, FileInfo fi) 
{ 
    try 
    { 
     FileStream fsFileToBeZipped = fi.OpenRead(); 

     ZipEntry entry = new ZipEntry(fi.FullName); 
     ZipFolder.PutNextEntry(entry); 
     int size = 2048; 
     byte[] buffer = new byte[size]; 

     while (true) 
     { 
      size = fsFileToBeZipped.Read(buffer, 0, buffer.Length); 

      if (size > 0) 
      ZipFolder.Write(buffer, 0, size); 
      else 
      break; 
     } //end while (true) 

     fsFileToBeZipped.Close(); 

     //prepare and delete file 
     fi.Attributes = FileAttributes.Normal; 
     //fi.Delete(); 
    } //end try 
    catch (Exception e) 
    { 
     Console.WriteLine("Error zipping File. Error - " + e.Message); 
    } //end catch 
} 

ответ

1

Ваша проблема здесь

new ZipEntry(fi.FullName); 

Аргумент ZipEntry путь в файле почтового индекса, а не полный путь сжатые данные поступают из. Обычно zip-библиотеки, такие как 7zip и SharpZip, раскрывают способ создания «пути ввода», но фактические данные, записанные в zip, относятся к полному пути.

Возможно, что вы хотите

new ZipEntry(Path.GetFileName(fi.fullName)) 
+1

В качестве альтернативы вы можете использовать только fi.Name, чтобы получить имя и расширение файла. –

+0

Точно. В общем, первым аргументом является то, что диктует, как имя файла появляется в архиве. – devshorts

+0

Работал как очарование! Благодарю. –