Элегантный / эффективный способ "потрогать" файл в (обновить 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/