4

(ModifiedTime を更新) WinRT でファイルを「タッチ」するエレガントでパフォーマンスの高い方法は?

30 日以上経過したファイルを削除する必要があるコードがいくつかあります。これはうまく機能しますが、場合によっては、ファイルの時間を更新して 30 日のウィンドウをリセットし、削除を防ぐ必要があります。basicProperties リストでは、ModifiedTime は読み取り専用なので、更新する別の方法を見つける必要があります...

方法 1: 名前を 2 回変更する

    // 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: P/Invoke 経由で Wi​​n32 API を使用しますか?

  • これが ARM デバイスで動作するかどうかわかりませんか?
  • 合格認定?
  • 高性能ですか?
  • これを行う最善の方法はありますか?コードサンプル?

他のアイデアはありますか?私は少し立ち往生しています:-)

どうもありがとう、ジョン

4

2 に答える 2

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();
        }
    }
}
于 2015-01-09T16:21:31.340 に答える
1

RT マシンにローカルに存在し、そのクラウドのどこかに存在しないファイルのリストを結合することを計画していると仮定すると (それ以外の場合は、WinRT doc mod プロセスについて心配する必要はありません)、アプリケーション データ コンテナーを簡単に使用できます。非常に薄いデータを保存するために各アプリに提供されます (キーと値のペアが非常によく適合します)。

このようにして、永続化が必要な各ファイルの将来の削除日を保存することで、次に削除が要求されたときに削除プロセスが発生する前に、アプリがアプリ ストレージ データをチェックします。プロセスからファイルが削除されないようにするだけの場合は、繰り返し処理しているファイルのアクセス許可について心配する必要はありません。

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/

于 2012-10-12T14:20:02.623 に答える