我正在尝试编写一个应用程序,将数据从 Windows 便携式设备(这里是三星 Galaxy Note 2)上的特定文件夹传输到我的 PC。
我能够成功列出所有文件夹和文件,并且还可以通过 WPD-API 访问我想要的特定文件夹。
在这个页面的帮助下,我编写了一个名为“PortableDevice”的类,它包装了设备上的每个对象并从中创建了一个 PortableDeviceObject(这是一个自制的类,不属于 API) 这是包装器的示例方法。
private static PortableDeviceObject WrapObject(IPortableDeviceProperties properties, string objectId)
{
PortableDeviceApiLib.IPortableDeviceKeyCollection keys;
properties.GetSupportedProperties(objectId, out keys);
PortableDeviceApiLib.IPortableDeviceValues values;
properties.GetValues(objectId, keys, out values);
// Get the name of the object
string name;
var property = new PortableDeviceApiLib._tagpropertykey();
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
property.pid = 4;
values.GetStringValue(property, out name);
// Get the type of the object
Guid contentType;
property = new PortableDeviceApiLib._tagpropertykey();
property.fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
property.pid = 7;
values.GetGuidValue(property, out contentType);
var folderType = new Guid(0x27E2E392, 0xA111, 0x48E0, 0xAB, 0x0C, 0xE1, 0x77, 0x05, 0xA0, 0x5F, 0x85);
var functionalType = new Guid(0x99ED0160, 0x17FF, 0x4C44, 0x9D, 0x98, 0x1D, 0x7A, 0x6F, 0x94, 0x19, 0x21);
if (contentType == folderType || contentType == functionalType)
{
return new PortableDeviceFolder(objectId, name);
}
return new PortableDeviceFile(objectId, name);
}
当我访问 name 属性时,我会认为我总是得到当前对象的全名(图片或音乐文件等)。但是只显示带有全名的图片(例如 test_picture.jpeg),但是当我在文件夹中阅读 PDF 时,它只打印出 PDF 的名称而不是 .PDF 扩展名。这是有问题的,因为我想遍历文件夹中的所有文件,想要获取数据流并将此流填充到我 PC 上的新文件中。到目前为止它可以工作,但是所有文件(图片除外)都是在没有适当扩展名的情况下创建的,因此无法使用或必须手动重命名。
所以这里有一个问题:如何访问 WPD 文件夹中每个文件的完整路径?