データベースを Windows 8 音楽ライブラリと同期させようとしていますが、効率的な解決策をまだ見つけていません。FileSystemWatcher
.NET には、 Windows 8 アプリでは利用できないがあることを知っています。現在、私の考えは、返されたファイルのリストをGetFilesAsync
データベースと比較し、何かが変更、削除、または追加されたかどうかを確認することです。これが理想的ではないことはわかっていますが、他に便利なものが見つかりませんWindows.Storage
。私の問題は、音楽ライブラリに変更があったときに、これらの更新を自動的に行いたいということです。ModifiedDate
変更がサブフォルダーで発生した場合、フォルダーのチェックは役に立ちません。いつ変更されたかを知る方法があるかどうか、誰かが知ってStorageFolder
いますか?
4 に答える
ContentsChanged
確実に発砲できる場合は、以下のコードが何が変更されたかを判断するのに役立つ場合があります。
高速ではないことに注意してください。GetBasicPropertiesAsync
〜5ミリ秒/ファイルかかるようです...したがって、1000ファイルのセットを比較するには〜10秒かかります。
(私は確実に発砲することができずContentsChanged
、何時間もグーグルで調べた後、他の多くの人が同じ問題を抱えているようです)
private class DiffSet
{
public IReadOnlyList<StorageFile> Added { get; set; }
public IReadOnlyList<StorageFile> Deleted { get; set; }
public IReadOnlyList<StorageFile> Changed { get; set; }
}
private static async Task<DiffSet> Diff(IEnumerable<StorageFile> oldSet, IEnumerable<StorageFile> newSet)
{
var newAsDict = newSet.ToDictionary(sf => sf.Path);
var added = new List<StorageFile>();
var deleted = new List<StorageFile>();
var changed = new List<StorageFile>();
var fromOldSet = new HashSet<string>();
foreach (var oldFile in oldSet)
{
if (!newAsDict.ContainsKey(oldFile.Path))
{
deleted.Add(oldFile);
continue;
}
var oldBasicProperties = await oldFile.GetBasicPropertiesAsync();
var newBasicProperties = await newAsDict[oldFile.Path].GetBasicPropertiesAsync();
var oldDateModified = oldBasicProperties.DateModified;
var newDateModified = newBasicProperties.DateModified;
if (oldDateModified != newDateModified)
{
changed.Add(oldFile);
}
fromOldSet.Add(oldFile.Path);
}
foreach (var newFile in newSet)
{
if (!fromOldSet.Contains(newFile.Path))
added.Add(newFile);
}
return new DiffSet
{
Added = added,
Deleted = deleted,
Changed = changed
};
}
これは私のために働く:
public async void ListenAsync() {
query = storageFolder.CreateFileQuery();
query.ContentsChanged += query_ContentsChanged;
var files = await query.GetFilesAsync();
}
void query_ContentsChanged(IStorageQueryResultBase sender, object args) {
// args has no info about what changed. check manually
}
Windows 8 アプリからその情報を取得できるとは思いません。最善の策は、フォルダーとファイルを非同期的にクエリし、その情報をデータベースに格納されている情報と比較することです。フォルダーとファイルを列挙する一例をここで参照してください。これは、あなたがやろうとしていることに対してあまり効率的ではないことを知っています。他の良い方法を見つけたら、共有してください。
StorageFileQueryResult
とそのイベントを使用しContentsChanged
て、フォルダとそのサブフォルダの変更について通知を受けることができます。ただし、イベントには実際に変更された内容に関する情報は含まれていないため、フォルダーを再解析して、関心のあるものが変更されているかどうかを確認する必要があります。