Я использую .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 = false
option в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 .... (остается ошибка)
Возможно, кто-то столкнулся с такой проблемой. Я буду рад любому совету. Благодарю.
Вы пытались использовать путь короче, чем 248 символов? –
@JayGould Да. Работает отлично. –
Извините, я был саркастичным.Если ваш каталог превышает 248 символов, работа не работает, вам нужен каталог, который не превышает лимита. –