Я знаю, что этот вопрос задают 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 (Уведомление):
Когда вы используете этот кусок кода в потоке С#, вы всегда получите ошибку "Длина пути превышена"... В этом случае вам нужно использовать "Диспетчер".
SHFileOperation
не может извлекать отдельные элементы из ZIP файла. Варианты, которые я вижу, это:
ZipPackage
из System.IO.Packaging
достаточную функциональность для удовлетворения ваших потребностей..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));
}
}
pFrom должен быть двойным с нулевым завершением:
string _from = Path.Combine(apk, "*.*") + "\0\0";
Это связано с тем, что он может содержать несколько путей, которые должны быть разделены нулями.