如果我使用 WindowsExplorer 从 Windows10 将文件复制到我的 moto G6 手机,则新创建的文件立即具有正确的 ModifyDate,就像 Windows 上的原始文件一样。来自 moto 设备上的应用程序的 Java File.setLastModified() 也可以工作。
我测试在我的 TransferContentToDevice() 代码中的 CreateObjectWithPropertiesAndData() 中使用来自 WPD_OBJECT_DATE_MODIFIED 的 PROPERTYKEY 值设置 IPortableDeviceValues,但它不起作用(参见代码示例)。
将文件复制到移动设备时是否可以设置修改日期?还是 WindowsExplorer 使用了不同的机制?如果是,详细说明,我可以从 c#/vb.net 使用它吗?或者 PortableDeviceApiLib 中是否有其他方法可以在创建文件后更改修改日期?有任何想法吗?提前致谢!
// typical code according to Christophe Geers
public void TransferContentToDevice(string fileName, string parentObjectId)
{
IPortableDeviceContent content;
this._device.Content(out content);
IPortableDeviceValues values = GetRequiredPropertiesForContentType(fileName, parentObjectId);
PortableDeviceApiLib.IStream tempStream;
uint optimalTransferSizeBytes = 0;
content.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSizeBytes, null);
...
...
}
// please see comments
private IPortableDeviceValues GetRequiredPropertiesForContentType(
string fileName,
string parentObjectId)
{
IPortableDeviceValues values =
new PortableDeviceTypesLib.PortableDeviceValues() as IPortableDeviceValues;
var WPD_OBJECT_PARENT_ID = new _tagpropertykey();
WPD_OBJECT_PARENT_ID.fmtid = DeviceGUID.ObjectParentID;
WPD_OBJECT_PARENT_ID.pid = 3 ;
values.SetStringValue(ref WPD_OBJECT_PARENT_ID, parentObjectId);
FileInfo fileInfo = new FileInfo(fileName);
var WPD_OBJECT_SIZE = new _tagpropertykey();
WPD_OBJECT_SIZE.fmtid = DeviceGUID.ObjectSize;
WPD_OBJECT_SIZE.pid = 11;
values.SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, (ulong) fileInfo.Length);
var WPD_OBJECT_ORIGINAL_FILE_NAME = new _tagpropertykey();
WPD_OBJECT_ORIGINAL_FILE_NAME.fmtid = DeviceGUID.OriginalFileName;
WPD_OBJECT_ORIGINAL_FILE_NAME.pid = 12;
values.SetStringValue(WPD_OBJECT_ORIGINAL_FILE_NAME, Path.GetFileName(fileName));
var WPD_OBJECT_NAME = new _tagpropertykey();
WPD_OBJECT_NAME.fmtid = DeviceGUID.ObjectName;
WPD_OBJECT_NAME.pid = 4;
values.SetStringValue(WPD_OBJECT_NAME, Path.GetFileName(fileName));
// my tests to set date modified
// reading modified date returns this format: "yyyy/MM/dd:hh:mm:ss.000" (values.GetStringValue(property, out datemodified)
var OBJECT_DATE_MODIFIED = new _tagpropertykey();
OBJECT_DATE_MODIFIED.fmtid = WPD_OBJECT_DATE_MODIFIED.fmtid;
OBJECT_DATE_MODIFIED.pid = WPD_OBJECT_DATE_MODIFIED.pid;
// values.SetStringValue(OBJECT_DATE_MODIFIED, "2020/01/01:01:01:01.000");
// value with StringValue produce runtime error
values.SetUnsignedLargeIntegerValue(OBJECT_DATE_MODIFIED, (ulong)1316137362000);
// value with UnsignedLargeInteger runs without error, but date modified ist not set
return values;
}
// the Guid an pid for date modified
static class WPD_OBJECT_DATE_MODIFIED
{
// [ VT_DATE ] Indicates the date and time the object was modified on the device.
// DEFINE_PROPERTYKEY( WPD_OBJECT_DATE_MODIFIED , 0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C , 19 );
public static Guid fmtid = new Guid(0xEF6B490D, 0x5CD8, 0x437A, 0xAF, 0xFC, 0xDA, 0x8B, 0x60, 0xEE, 0x4A, 0x3C);
public static uint pid = 19;
}