Windows Portable Devices (WPD), C#: Как установить «дату изменения» при создании файла на Portable Device - PullRequest
0 голосов
/ 17 февраля 2020

Если я скопирую файл из Windows10 с помощью WindowsExplorer на мой телефон moto G6, у нового созданного файла сразу же будет правильная ModifyDate, как и у исходного файла на Windows. Java File.setLastModified () из приложения на мото-устройстве также работает.

Я проверил, чтобы установить значения IPortableDeviceValues ​​со значениями PROPERTYKEY из WPD_OBJECT_DATE_MODIFIED в CreateObjectWithPropertiesAndData () в моем коде TransferContentToDe (за мой код TransferContentToDe) (см. пример кода).

Возможно ли установить дату изменения при копировании файла на мобильные устройства? Или 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;
    }
...