Как распаковать один файл из ZipFile, используя «SHFILEOPSTRUCT»?

1

Я знаю, что этот вопрос задают 1000 раз, но я не хочу использовать какие-либо внешние инструменты, такие как (DotNetZip или SharpZipLib).

У меня есть этот рабочий код:

string _from = Path.Combine(apk, "*.*") + '\0';
string _to = destination + '\0' + Path.Combine(destination, "*.*") + '\0';
NativeMethods.SHFILEOPSTRUCT fileop = new NativeMethods.SHFILEOPSTRUCT();
fileop.pFrom = _from;
fileop.pTo = _to;
fileop.wFunc = NativeMethods.FO_Type.FO_COPY;
fileop.fFlags = NativeMethods.FOF_Flag.FOF_WANTNUKEWARNING;
NativeMethods.SHFileOperation(ref fileop);

Моя проблема в том, что я не могу извлечь/скопировать один файл/папку. Если я заменю *.* Например, res\\drawable\\icon.png он ничего не сделает.

Может ли кто-нибудь сказать мне, как извлечь один файл/папку с помощью SHFILEOPSTRUCT? Я что-то пропустил?

Код поддерживает:

Версия Framework:.Net Client 4

ОС: WinXP, 8, 8.1, 10

EDIT (Уведомление):

Когда вы используете этот кусок кода в потоке С#, вы всегда получите ошибку "Длина пути превышена"... В этом случае вам нужно использовать "Диспетчер".

  • 1
    Какова ваша цель. Net Framework?
  • 0
    Я использую .NET Client 4. (только добавил его в свой вопрос)
Показать ещё 2 комментария
Теги:
pinvoke

3 ответа

1
Лучший ответ

SHFileOperation не может извлекать отдельные элементы из ZIP файла. Варианты, которые я вижу, это:

  1. Включите стороннюю ZIP-библиотеку.
  2. Переключитесь на.net 4.5 и используйте библиотеку ZIP-архивов.
  3. Посмотрите, имеет ли ZipPackage из System.IO.Packaging достаточную функциональность для удовлетворения ваших потребностей.
  4. Напишите свой собственный почтовый индекс.
  5. Извлеките весь файл ZIP во временный каталог, а затем выберите нужные вам части.
  • 0
    Привет, спасибо за твою информацию! - Но я не могу выполнить шаг 1-3, поэтому я решил (вчера) распаковать весь zip-файл в папку tmp и вручную переместить необходимые файлы / папки. - Про самодельную упаковку zip это мой следующий проект. ;) - Тем не менее, НАМНОГО СПАСИБО за этот действительно полезный намек!
4

.NET 4.5 имеет встроенную поддержку ZIP, вы должны попробовать это

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries.Where(e => e.FullName.Containts("a")))
    {
        entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
    }
} 
  • 0
    Спасибо за пример кода, но я не могу переключиться на более высокую версию фреймворка. Потому что я использую этот код внутри моей DLL, который используется многими PPL ... Так что они также должны установить более высокую версию .NET.
1

pFrom должен быть двойным с нулевым завершением:

string _from = Path.Combine(apk, "*.*") + "\0\0";

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

  • 0
    THX за подсказку, но это все еще не работает. Он все еще не хочет извлечь один элемент.
  • 1
    В моем предыдущем примере была синтаксическая ошибка (одинарные кавычки против двойных кавычек). Предполагая, что вы поймали это, вы можете добавить точную ошибку, которую вы получите, когда пытаетесь это сделать?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню