2016-08-12 9 views
0

Я использую .Net Framework 4.0; VS 2015; Ionic.Zip.Reduced (DotNetZip.Reduced) v1.9.1.8. Когда я пытаюсь добавить папку в архив получаю исключение с текстом:Когда я пытаюсь добавить папку в архив, получим ошибку: путь слишком длинный

The path is too long

Пример кода:

using (var zipFile = new ZipFile(zipFilePath)) 
{ 
    zipFile.UseZip64WhenSaving = Zip64Option.AsNecessary; 
    zipFile.AlternateEncodingUsage = ZipOption.Always; 
    zipFile.AlternateEncoding = Encoding.UTF8; 
    zipFile.ParallelDeflateThreshold = -1; 

    var dirPath = @"C:\AAAAAAAAAAA\AAAAAA\AAAAAAAAAAAAAAA\AAAAAAAAA\AAAAAAAAAAAAA\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"; 
    zipFile.AddDirectory(dirPath); <-Exception 
    zipFile.Save(); 
} 

В папке есть файл с именем: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.zip

В результате от ошибки:

The path is too long

Переведено в файл на основе архивации (с использованием relati в путь):

using (var zipFile = new ZipFile(zipFilePath)) 
{ 
    zipFile.UseZip64WhenSaving = Zip64Option.AsNecessary; 
    zipFile.AlternateEncodingUsage = ZipOption.Always; 
    zipFile.AlternateEncoding = Encoding.UTF8; 
    zipFile.ParallelDeflateThreshold = -1; 

    var dirPath = @"C:\AAAAAAAAAAA\AAAAAA\AAAAAAAAAAAAAAA\AAAAAAAAA\AAAAAAAAAAAAA\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"; 
    Directory.SetCurrentDirectory(dirPath); 
    var files = Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories).ToArray(); 

    foreach (var fullFilePath in files) 
    { 
    var fileName = Path.GetFileName(fullFilePath); 
    var relatedPath = fullFilePath.Substring(0, fullFilePath.LastIndexOf(fileName, StringComparison.InvariantCultureIgnoreCase)).Replace(zipDir, ""); 
    var relatedFilePath = Path.Combine(relatedPath, fileName); 

    zipFile.AddFile(relatedFilePath); <-Exception 
    } 
    zipFile.Save(); 
} 

ошибка такой же:

The path is too long

Я попытался вызвать Path.GetDirectoryName() метод, но он также возвращает ошибку:

The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

Я нашел много решений, но чтобы работать и не работал (из-за особенностей приложения к новой версии Framework'a не может быть).

  • Использование рамок 4.6.2. Установите UseLegacyPathHandling = falseoption в App.Config или Switch.System.IO.UseLegacyPathHandling = false; Switch.System.IO.BlockLongPaths = false
  • При упоминании о групповой политике и включение опции конфигурации> Административные шаблоны> Система> Filesystem>Enable NTFS long paths или включить опцию с помощью манифеста <ws2:longPathAware>true</ws2:longPathAware>
  • Используйте префикс \\?\In the path (я понимаю, что для новой версии Framework) пути
  • Преобразовать в файл в формате 8.3, используя функцию GetShortPathName .... (остается ошибка)

Возможно, кто-то столкнулся с такой проблемой. Я буду рад любому совету. Благодарю.

+1

Вы пытались использовать путь короче, чем 248 символов? –

+0

@JayGould Да. Работает отлично. –

+0

Извините, я был саркастичным.Если ваш каталог превышает 248 символов, работа не работает, вам нужен каталог, который не превышает лимита. –

ответ

1

Если ваш путь слишком длинный, вы вряд ли сможете это сделать. Даже если вы можете перемещать Windows, на следующий шаг ваше приложение не будет работать в ненастроенной конфигурации в этом сценарии.

Вы можете обходным путем копировать файлы, с которыми вы должны работать, в временную папку, такую ​​как C: \ temp, и добавлять туда файлы в архив.

Вы даже можете имитировать ту же структуру дерева папок с именами каталогов, состоящими только из 1 или 2 букв, и сопоставить полный (но более короткий) путь каталога к исходному пути где-нибудь (например, к файлу), чтобы вы можете восстановить исходную структуру дерева папок с тем же именем позже.

+0

Да, я хочу сохранить его как структуру папок для дальнейшего восстановления данных. –

0

Возможно, этот ответ помогает https://stackoverflow.com/a/1880480/3061797

This is not strictly true as the NTFS filesystem supports paths up to 32k characters. You can use the win32 api and "\?\" prefix the path to use greater than 260 characters.

A detailed explanation of long path from the .Net BCL team blog. A small excerpt highlights the issue with long paths

+0

Это решение работает с .Net Framework и выше 4.0. Но это решение работает при использовании внешней программы, такой как 7zip. Но я не хочу запускать внешние программы. –