Извлечение C# SharpZipLib .TGZ NotSupportedException

Я новичок в программировании, так что наберитесь терпения.

В настоящее время я разрабатываю небольшую программу в Visual С# 2010 Express, .NET Framework 4.0, которая запускает сценарий на компьютере с Linux (что создает файл /tmp/logs.tgz), загружает файл, а затем я хочу извлечь его. Запуск скрипта и загрузка файла через Renci.SshNet работает без нареканий. Но когда я хочу извлечь его, он выдает ошибку «NotSupportedException», что мой формат пути к файлу неверен (я думаю, что это не так?). Я копирую и вставляю код прямо из здесь (простой полный экстракт из TGZ (.tar.gz)) и отредактировал его для своих нужд:

        using System.IO;
        using System.IO.Compression;
        using ICSharpCode.SharpZipLib.GZip;
        using ICSharpCode.SharpZipLib.Tar;
        //it executed the Script and created the file on the Linux Machine /tmp/logs.tgz
        //now I want to download it

        string myTime = DateTime.Now.ToString("yyyyMMdd");
        var pathWithEnv = (@"%USERPROFILE%\Desktop\logs" + myTime + ".tgz");
        var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv);
        string localFile = filePath;

        //then downloads /tmp/logs.tgz to ..\Desktop\logs+ myTime +.tgz
        //everything great until now. here I want to extract .TGZ:

        var pathWithEnv2 = (@"%USERPROFILE%\Desktop\logs" + myTime);
        var fileDir = Environment.ExpandEnvironmentVariables(pathWithEnv2);
        string localDir = fileDir;

        Stream inStream = File.OpenRead(localFile);
        Stream gzipStream = new GZipInputStream(inStream);

        TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream);
        //ERROR OCCURS HERE:
        tarArchive.ExtractContents(localDir);

        tarArchive.Close();
        gzipStream.Close();
        inStream.Close();

Я даже пытался установить строки localFile и localDir без EnviromentVariable, но это не помогло. Я попытался: - загрузить и извлечь его прямо на C:\ (или на подключенный сетевой диск U:), чтобы предотвратить слишком длинные имена файлов (чего не должно быть, поскольку длина никогда не должна превышать 86 символов). - string = @"C:..\logs", string = "C:\..\logs", string = @"C:..\logs\" и т.д. - пробовал без myTime - с использованием ICSharpCode.SharpZipLib .Основной;

Я сделал MessageBox.Show(localDir); перед tarArchive.ExtractContents(localDir); и он показал «C:\Users\Baumann\Desktop\logs20140530», что правильно, это каталог, в который я хочу его извлечь. Даже создание каталога перед его выполнением не помогает.

Я также создал новый проект всего с одной кнопкой, которая должна запустить извлечение, и возникает та же ошибка.

Я попытался, делая это отдельно, сначала извлечь GZip, а затем .tar, но это также дает мне ту же ошибку при извлечении GZip (используя ICSharpCode.SharpZipLib.Core; конечно).

Что меня еще больше сводит с ума, так это то, что он начинает извлекать его, но не все, до того, как он выйдет из строя. И всегда одни и те же Файлы, что для меня непонятно, почему эти, а почему не другие.

Я использую Windows 8.1, использую SharpZipLib 0.86.0.518, загруженную непосредственно с веб-сайта.

Заранее спасибо.


person Pascal Baumann    schedule 30.05.2014    source источник
comment
У вас здесь много всего происходит; попробуй уменьшить проблему. Создайте файл .tgz (или .zip или какой-либо другой файл), поместите его на рабочий стол, а затем жестко задайте путь в программе. Это по нескольким причинам. 1. Это важная часть этикета на этом сайте. 2. Важно пытаться решать одну проблему за раз — и это еще более важно, если вы только начинаете.   -  person David    schedule 30.05.2014
comment
Привет, Дэвид, спасибо. Я создал новый проект, поместил logs.tgz на рабочий стол (C:\Users\Baumann\Desktop) и попытался извлечь его в C:\..\Desktop\logs. Но возникает та же проблема...   -  person Pascal Baumann    schedule 30.05.2014
comment
Я бы также начал с очень простого архива — скажем, одного файла (внутри .tar). Затем попробуйте несколько файлов, затем добавьте подкаталоги, затем вложенные подкаталоги и т. д.   -  person David    schedule 30.05.2014
comment
Вы также должны опубликовать детали исключения (также для `InnerException', если оно есть).   -  person David    schedule 30.05.2014
comment
Привет, Дэвид, теперь я проверил то, что вы сказали, и обнаружил, что когда я открываю .tgz с помощью 7zip, копирую файлы, например, во временную папку, удаляю все файлы в .tar, сохраняю его, снова открываю и копирую все файлы обратно, а затем снова сохраняю их, я могу распаковать их без каких-либо ошибок. Я попытался выполнить свою программу от имени администратора, но это тоже не помогло...   -  person Pascal Baumann    schedule 30.05.2014
comment
Если я правильно вас понимаю, вы не получите сообщение об ошибке, если создадите tar-архив в Windows, только когда загрузите его с компьютера с Linux. Если да, то это похоже на несовместимость формата tar. Попробуйте удалить сжатие из микса () и посмотрите, поможет ли это. Вы также можете попробовать другую версию (реализацию) tar в Linux, если это возможно.   -  person David    schedule 30.05.2014
comment
Да я особо и не создаю новый. Я удаляю файлы, сохраняю их, добавляю файлы обратно и снова сохраняю. Это не вариант для меня, извините... Мне приходится работать с тем, что предоставляет мне Linux Machine. Я начал искать некоторые библиотеки 7zip и Saw SevenZipSharp, но мне нужно добавить 7z.dll, и это дает мне ошибку, что это недопустимая сборка или COM-компонент.   -  person Pascal Baumann    schedule 30.05.2014


Ответы (1)


ну наконец-то я решил проблему. Машина Linux создает файл, который включает MAC-адрес, и, поскольку Windows не может обрабатывать «:» в имени файла, происходит сбой. Теперь я извлекаю файл за файлом и проверяю каждый файл на «:» и заменяя его на «_», работает безупречно.

person Pascal Baumann    schedule 25.06.2014