Элегантный / эффективный способ "потрогать" файл в (обновить ModifiedTime) в WinRT?

Элегантный / эффективный способ "потрогать" файл в (обновление ModifiedTime) WinRT?

У меня есть код, который должен удалить файлы старше 30 дней. Это хорошо работает, но в некоторых случаях мне нужно обновить время в файле, чтобы сбросить 30-дневное окно и предотвратить удаление. В списке основных свойств, ModifiedTime доступен только для чтения, поэтому мне нужно найти другой способ обновить его...

Способ 1: переименовать дважды

    // Ugly, and may have side-effects depending on what's using the file
    // Sometimes gives access denied...
    public static async Task TouchFileAsync(this StorageFile file)
    {
       var name = file.Name;
       await file.RenameAsync("~" + name).AsTask().ContinueWith(
            async (task) => { await file.RenameAsync(name); }
       );
    }

Способ 2: изменить свойство файла

    // Sometimes works, but currently throwing an ArgumentException for
    // me, and I have no idea why. Also tried many other properties:
    // http://msdn.microsoft.com/en-us/library/windows/desktop/bb760658(v=vs.85).aspx
    public static async Task TouchFileAsync(this StorageFile file)
    {
        var prop = new KeyValuePair<string, object>("System.Comment", DateTime.Now.Ticks.ToString());
        await file.Properties.SavePropertiesAsync(new[] { prop });
    }

Способ 3: использовать Win32 API через P/Invoke?

  • Не уверен, что это будет работать на устройствах ARM?
  • Пройти сертификацию?
  • Быть исполнителем?
  • Есть ли лучший способ сделать это? Пример кода?

У кого-нибудь есть другие идеи? Я немного застрял:-)

Большое спасибо, Джон

2 ответа

Я просто нуждался в этом, и вот мое решение.

использование

await storageFileToTouch.TouchAsync();

код

public static class StorageFileExtensions
{
    /// <summary>
    ///     Touches a file to update the DateModified property.
    /// </summary>
    public static async Task TouchAsync(this StorageFile file)
    {
        using (var touch = await file.OpenTransactedWriteAsync())
        {
            await touch.CommitAsync();
        }
    }
}

Предполагая, что вы планируете комбинировать список файлов, которые существуют локально на компьютере RT, а не где-то в этом облаке (в противном случае нам не придется беспокоиться о процессе модификации WinRT doc mod), вы можете легко использовать Application Data Container. предоставляется каждому приложению для хранения очень тонких данных (пары ключ-значение очень хорошо подходят).

Таким образом, вы будете хранить будущую дату удаления для каждого файла, который необходимо сохранить, чтобы в следующий раз, когда он был поднят для удаления, до того, как произойдет процесс удаления, приложение проверяет данные хранилища приложений. Тогда вам не нужно беспокоиться о разрешениях файлов, которые вы перебираете, когда вы только пытаетесь убедиться, что они не будут удалены из вашего процесса.

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;

// Create a setting in a container

Windows.Storage.ApplicationDataContainer container = 
   localSettings.CreateContainer("FilesToPersist", Windows.Storage.ApplicationDataCreateDisposition.Always);

StorageFile file = fileYouWantToPersist; 

if (localSettings.Containers.ContainsKey("FilesToPersist"))
{

   localSettings.Containers["FilesToPersist"].Values[file.FolderRelativeId] = DateTime.Now.AddDays(30);
}

// Read data from a setting in a container

bool hasContainer = localSettings.Containers.ContainsKey("FilesToPersist");
bool hasSetting = false;

if (hasContainer)
{
   hasSetting = localSettings.Containers["FilesToPersist"].Values.ContainsKey(file.FolderRelativeId);
    if(hasSettings)
    {
         string dt =    localSettings.Containers["FilesToPersist"].Values[file.FolderRelativeId];
         if(Convert.ToDateTime(dt) < DateTime.Now)
         {
             //Delete the file
         }
    }
}

Ресурсы:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.applicationdata.aspx

http://lunarfrog.com/blog/2011/10/10/winrt-storage-accesscache/

Другие вопросы по тегам