2015-03-22 2 views
0

Как получить все имена папок и файлов в виртуальном устройстве, подключенном к компьютеру? В C++;C++ как получить имена папок и файлов с виртуального устройства?

У меня проблема, потому что у виртуального устройства нет буквы, такой как локальный диск; путь начал как этот "компьютер \ SUPRA_M727G \ Внутренняя память" enter image description here

+0

Как мы должны знать? Мы не знаем, что такое устройство или как оно установлено, или что делает его драйвер. Все, что мы знаем, это то, что он называется «КОМПЬЮТЕР» в представлении графического пути проводника Windows Explorer. –

+0

Это устройство представляет собой внутреннее хранилище Android, которое установлено через протокол MTP. Я не могу получить файлы с этого устройства, потому что я знаю только, как читать файлы с логических дисков, имеющих букву. – Vladimir

+1

Локальные диски (или тома, правда) не имеют букв дисков. Буквы дисков - это остатки прошлого, с того времени, пока вы еще не родились. Вместо этого тома ссылаются по имени во всей системе. Имена томов имеют синтаксис: \\? \ Volume {GUID} \. Дополнительную информацию см. В разделе [Именование тома] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365248.aspx). Буквы на диске - это не что иное, как удобство и бремя совместимости. – IInspectable

ответ

3

Вы должны использовать интерфейсы Shell, а именно IShellFolder и IEnumIDList.

Чтобы получить IShellFolder для папки "Internal storage", вы можете:

  1. Использование SHGetDesktopFolder() получить IShellFolder для корня пространства имен Shell, а затем передать "Computer\SUPRA_M727G\Internal storage" строку своему методу IShellFolder::ParseDisplayName(), чтобы получить absolute ITEMIDLIST что вы можете перейти к его методу IShellFolder::BindToObject().

  2. Использование SHParseDisplayName() или ILCreateFromPath() преобразовать "Computer\SUPRA_M727G\Internal storage" строки в абсолютную ITEMIDLIST, что вы можете перейти на SHBindToObject() с параметром psf равного NULL.

В любом случае, как только у вас есть IShellFolder папки для хранения, вы можете использовать его метод IShellFolder::EnumObjects() получить IEnumIDList для перечисления своих файлов и вложенных папок. Перечисление даст вам относительный ITEMIDLIST для каждого элемента. Чтобы получить имя каждого элемента в виде строки, пройдите каждый ITEMIDLIST к его методу IShellFolder::GetDisplayNameOf(), а затем передайте возвращенный STRRET в одну из функций StrRetTo...() (StrRetToBSTR(), StrRetToBuf() или StrRetToStr()).

Обратитесь к MSDN для получения более подробной информации:

Introduction to the Shell Namespace

Navigating the Shell Namespace

Смежные вопросы