![](/img/trans.png)
[英]How to transfer file to Android Device without drive letter using WPD
[英]How to rename an object on a WPD device
我正在制作PortablePortLib的一個分支 ,它與WPD / MTP設備上的存儲服務一起使用。 偶然發現一個問題。 我想在設備上重命名文件對象,因此首先想到的是更改對象的WPD_OBJECT_ORIGINAL_FILE_NAME
屬性。 但是我這樣做很例外。 如果更改WPD_OBJECT_NAME
,名稱將更改,但文件名與預期的相同,也不例外。
所以問題是,如何在WPD設備上重命名對象? 為什么我得到異常更改文件名屬性?
我想重命名的原因是,在將文件復制到設備時,如果文件已經存在,它將得到擴展名dup0
, dup1
等的副本。
這是一個古老的回應,但是...
以下是我用來在WPD設備上重命名對象的代碼:
__declspec(dllexport) HRESULT __cdecl supportsCommand( CComPtr<IPortableDevice>& device, PROPERTYKEY theKey ) {
HRESULT err = S_OK;
CComPtr<IPortableDeviceCapabilities> capabilities;
CComPtr<IPortableDeviceKeyCollection> commands;
uint numCommands = 0;
device->Capabilities( &capabilities );
err = capabilities->GetSupportedCommands( &commands );
err = commands->GetCount( &numCommands );
PROPERTYKEY key = WPD_PROPERTY_NULL;
for( uint index = 0; index < numCommands; index++) {
err = commands->GetAt( index, &key );
if( IsEqualPropertyKey(theKey, key) )
return true;
}
return false;
}
__declspec(dllexport) HRESULT __cdecl renameObject( CComPtr<IPortableDevice>& device, LPWCSTR objectId, LPWCSTR newName ) {
HRESULT err = S_OK;
if (supportsCommand(device, WPD_COMMAND_OBJECT_PROPERTIES_SET) == false)
return (HRESULT)-1;
CComPtr<IPortableDeviceValues> properties, values, results;
err = CoCreateInstance( CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**) &properties );
err = CoCreateInstance( CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_IPortableDeviceValues, (VOID**) &values );<br>
// Mount the command.
err = properties->SetGuidValue( WPD_PROPERTY_COMMON_COMMAND_CATEGORY
, WPD_COMMAND_OBJECT_PROPERTIES_SET.fmtid );
err = properties->SetUnsignedIntegerValue( WPD_PROPERTY_COMMON_COMMAND_ID
, WPD_COMMAND_OBJECT_PROPERTIES_SET.pid );<br>
// Set the values
err = properties->SetStringValue( WPD_PROPERTY_OBJECT_PROPERTIES_OBJECT_ID, objectId );
err = values->SetStringValue( WPD_OBJECT_ORIGINAL_FILE_NAME, newName );
err = properties->SetIPortableDeviceValuesValue( WPD_PROPERTY_OBJECT_PROPERTIES_PROPERTY_VALUES, values );
err = device->SendCommand( 0, properties, &results );<br>
// Show the results
uint count = 0;
results->GetCount( &count );
PROPERTYKEY key;
PROPVARIANT var;
for( uint i = 0; i < count; i++ ) {
results->GetAt( i, &key, &var );
// ...show key and var...
}
return err;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.