在我的项目中,我使用Windows便携设备(WPD)API来枚举移动设备的内容。 WPD API Enumeration Guide。我能够枚举每个对象并查看其属性,如API编程指南中所示。 WPD API Properties Guide
但是,当我尝试获取名称中包含.
的对象名称时,返回的值将在.
处截断
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本身无法获取完整的文件夹名称。
谢谢你的时间!
答案 0 :(得分:5)
WPD Application Programming Reference指的是3个NAME。
WPD_OBJECT_HINT_LOCATION_DISPLAY_NAME:一个更友好的名字,主要用于展示
WPD_OBJECT_NAME:设备上对象的名称。
WPD_OBJECT_ORIGINAL_FILE_NAME:设备上对象的原始文件名。
C ++中的MS代码示例使用 WPD_OBJECT_ORIGINAL_FILE_NAME 来获取实际文件名(在对象下面),同时将文件从设备传输到PC。
我修改了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海量存储)的某些组合,我不会感到惊讶。
以下是我修改的代码部分(以及它的工作原理)。
// 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
}