Имя файла объекта WPD усечено до '.'

В своем проекте я использую API Windows Portable Device (WPD) для перечисления содержимого мобильного устройства. Руководство по перечислению WPD API. Я могу перечислить каждый объект и просмотреть его свойства, как показано в руководстве по программированию API. Руководство по свойствам WPD API

Однако, когда я пытаюсь получить имя объекта, в имени которого есть ., возвращаемое значение усекается до этого .

HRESULT hr = objectProperties->GetStringValue(WPD_OBJECT_NAME, &strOriginalFileName);
if(FAILED(hr))
    return false;

PWSTR wideStr = strOriginalFileName;
char buffer[20];
wcstombs(buffer, wideStr, 20);

qDebug() << buffer;

Так, например, объект (папка на устройстве) с именем com.example возвращается как com. Это становится очевидной проблемой, когда я пытаюсь найти определенный путь к файлу на устройстве.

Я не могу понять, что не так. Я неправильно понимаю, как на самом деле называется имя файла? Является ли example другим свойством или чем-то внутри объекта com? Я очень смущен.

РЕДАКТИРОВАТЬ: Итак, я использовал образец программного обеспечения WPD API для получения всех свойств объекта объекта com.example, и вы можете видеть, что сам WPD не может получить полное имя папки. введите здесь описание изображения

Спасибо за ваше время!


person mrg95    schedule 02.11.2016    source источник


Ответы (1)


Справочник по программированию приложений WPD ссылается на следующие 3 имени.

WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME: более понятное имя, в основном предназначенное для отображения

WPD_OBJECT_NAME: имя объекта на устройстве.

WPD_OBJECT_ORIGINAL_FILE_NAME: исходное имя файла объекта на устройстве.

Пример кода MS на C++ использует WPD_OBJECT_ORIGINAL_FILE_NAME для получения фактического имени файла (под объектом) при передаче файлов с устройства на ПК.

Я изменил образец кода MS (для перечисления свойств объекта), и он показал мне фактическое имя файла (ничего не усекается от имени файла com.ef1.first.second)

Вот изображение

Я использовал:

    Windows Windows 7 Ultimate (without SP1)
    Visual Studio 2013
    Android 4.4.4 (Moto-E)
    Connection type: MTP
    Memory type: Internal Memory as well as External (SD Card)

Я не удивлюсь, если он не будет работать с некоторыми комбинациями версий Windows, версий Windows SDK, версий Android, типов подключения (MTP, PTP, USB Mass Storage).


Вот часть кода, которую я модифицировал (и вот как это работало).

// Reads properties for the user specified object.
void ReadContentProperties(_In_ IPortableDevice* device)
{
   //.... Edited for brevity
   tempHr = propertiesToRead->Add(WPD_OBJECT_NAME);
   if (FAILED(tempHr))
   {
      wprintf(L"! Failed to add WPD_OBJECT_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", tempHr);
   }

   // Here is the added code
   tempHr = propertiesToRead->Add(WPD_OBJECT_ORIGINAL_FILE_NAME);
   if (FAILED(tempHr))
   {
      wprintf(L"! Failed to add WPD_OBJECT_ORIGINAL_FILE_NAME to IPortableDeviceKeyCollection, hr= 0x%lx\n", tempHr);
   }
    //.... Edited for brevity
}
person blackpen    schedule 05.11.2016
comment
WPD_OBJECT_ORIGINAL_FILE_NAME не является свойством объекта. На приложенном снимке экрана показаны ВСЕ связанные свойства объекта. Я несколько дней пытался подать заявку на это имущество. В одних файлах есть, в других нет. (Я считаю). Каждый раз, когда я пытаюсь получить WPD_OBJECT_ORIGINAL_FILE_NAME, час возвращается как неудавшийся. - person mrg95; 06.11.2016
comment
Я считал WPD_OBJECT_ORIGINAL_FILE_NAME обязательным. Могу я узнать, какую файловую систему использует ваше устройство? Это может намекнуть на более важную информацию. - person blackpen; 06.11.2016
comment
Просто телефон на андроиде. OnePlus One, если быть точным, но мне нужно, чтобы мое программное обеспечение поддерживало различные телефоны/планшеты. - person mrg95; 06.11.2016
comment
Я не понимаю, почему за ваш ответ проголосовали (без обид). Хотя это просто не правильно. Я знал о WPD_OBJECT_ORIGINAL_FILE_NAME с самого начала, и он всегда возвращался со сбоем. Немного продолжения было бы неплохо :) - person mrg95; 24.11.2016
comment
@ mc360pro, просто каждый пример, с которым я сталкивался, использовал эту технику (включая документы MS). Но я не удивлюсь, если это не сработает для определенной комбинации ОС (версия, обновление, исправления), языка, версии SDK, портативного устройства (производитель, ОС, обновления, тип файловой системы). Я поэкспериментирую с несколькими устройствами Android (с Win7) и дам вам знать. - person blackpen; 24.11.2016
comment
Спасибо. Да, я тоже использую Android на Win 7. Спасибо за вашу помощь :) - person mrg95; 24.11.2016
comment
Извините, @ mc360pro, у меня закончились ресурсы, пытаясь установить огромные загрузки для dotNet ... а затем Windows SDK для C ++ ... (оба из них, похоже, нуждаются в пакете обновления 1 для Win7). Если у вас есть время, вы можете попробовать прочитать расширенные атрибуты в папках, как указано здесь . - person blackpen; 25.11.2016
comment
Я установил Visual Studio 2013 на Win7. Я запускаю пример кода WPD, чтобы вывести список всех объектов на устройстве (Android). Я свяжусь с вами, как только смогу создать и перечислить папку с желаемыми свойствами. - person blackpen; 28.11.2016
comment
Мне удалось создать файл на внешней SD-карте с именем com.ef1.first.second и перечислить все его свойства (изменив пример кода для печати WPD_OBJECT_ORIGINAL_FILE_NAME). Добавлю снимок. - person blackpen; 28.11.2016
comment
Хммм, так что, если дело доходит до используемых устройств, почему папка нормально отображается при просмотре устройства с помощью проводника Windows? Windows каким-то образом получила полное имя. Я бы предположил, что имя все еще можно получить, даже если исходное свойство имени не установлено. Обратите внимание, что фактическое имя папки — com.mojang, поэтому попробуйте установить Minecraft PE на устройство и посмотрите, работает ли он там... - person mrg95; 29.11.2016
comment
Вы можете попробовать воспроизвести проблему на внешней карте памяти (установленной SD-карте). Если вы не можете воспроизвести его, значит, в вашей файловой системе (во внутренней памяти) должно быть что-то другое, из-за чего Windows не работает. - person blackpen; 03.12.2016
comment
Но Windows не дает сбоев, потому что в проводнике, встроенном в Windows, все в порядке. Каким-то образом оно получает полное название. - person mrg95; 04.12.2016
comment
Может ли WPD получить полные имена файлов, которые были созданы с помощью пользовательского интерфейса Android (и имеют точки в них)? - person blackpen; 04.12.2016
comment
Также не могли бы вы добавить свой измененный код к вопросу? - person blackpen; 04.12.2016
comment
Я надеюсь, что нет никаких проблем со странными символами/буквами в именах файлов (например, управляющими символами). - person blackpen; 04.12.2016
comment
Только что создал еще одну папку с расширением . вручную. До сих пор не могу схватить. Затем я попытался получить исходное имя файла, используя код из моего примера (просто изменил ключ свойства), и hr не удалось. Фактически, это не удалось для каждого объекта на устройстве. - person mrg95; 04.12.2016
comment
Вот все имена, которые я получил при использовании OBJECT_NAME gyazo.com/063894fda62496277f53820b2dc09993. Вы можете увидеть com, затем материалы minecraft, затем еще один com, который я сделал вручную. Но вот они в проводнике Windows gyazo.com/bb9d893a5c99071ad56edca0d6e3e74d - person mrg95; 04.12.2016
comment
Ладно поправочка. Это не сработало для каждого объекта, только для первых двух. Но я позволяю моему перечислению пропустить это и отображать каждое значение из каждого объекта. Одна секунда..... О! ЭТО ПОЛУЧИЛО ИМЕНА! Вау, я чувствую себя идиотом. Проблема заключалась в том, что он не мог получить исходные имена родительских записей, что приводило к прекращению перечисления. Извините, что так долго это продолжаю. Вы очень помогли!!!!!! - person mrg95; 04.12.2016
comment
Вот был выход. Таким образом, OBJECT_NAME усекается до '.' потому что он думает, что все после является расширением файла gyazo.com/82ad1184b71a92c116a4a8e672508b1d - person mrg95; 04.12.2016
comment
Таким образом, мое полное решение состоит в том, чтобы прочитать как имя объекта, так и имя исходного файла. Затем, если исходное не удалось, используйте обычное имя объекта для проверки пути. - person mrg95; 04.12.2016
comment
1) имя объекта усекается до первой точки (за исключением случаев, когда имя объекта начинается с точки). 2) исходное имя всегда имело полное значение (за исключением объектов корневого уровня, таких как SD-карта, где оно давало ‹Not Found› ). 3) Имя объекта и исходное имя могут не всегда совпадать (имя объекта может быть Новая папка, тогда как исходное имя может быть com.example) < b>4) При использовании MTP проводник Windows не отображает пустые папки до тех пор, пока вы не поместите в них файлы (неважно, есть ли у них точка в имени объекта или оригинальное имя файла или нет). - person blackpen; 04.12.2016
comment
Я сохраню настройки кода на пару месяцев. Если вы столкнетесь с какими-либо странными проблемами, которые вам нужно воспроизвести, подайте мне звуковой сигнал. - person blackpen; 04.12.2016
comment
Номер 4 не соответствует действительности с моей стороны. Мой показывает пустые папки - person mrg95; 04.12.2016
comment
Я проверил это дважды. Еще вполне возможно, что я мог что-то там упустить. - person blackpen; 04.12.2016