我正在尝试使数据库与 Windows 8 音乐库保持同步,但我还没有找到有效的解决方案。我知道 .NET 有一个FileSystemWatcher
不适用于 Windows 8 应用程序的功能。目前,我的想法是将返回的文件列表GetFilesAsync
与我的数据库进行比较,并检查是否有某些内容被修改、删除或添加。我知道这并不理想,但我在Windows.Storage
. 我的问题是,一旦对音乐库进行了修改,我想自动进行这些更新。当更改发生在子文件夹中时,检查ModifiedDate
文件夹是没有用的。有谁知道是否有办法判断什么时候StorageFolder
被修改了?
问问题
1335 次
4 回答
1
如果您能够ContentsChanged
可靠地触发,那么下面的代码可以帮助您确定发生了什么变化。
请注意,它并不快。GetBasicPropertiesAsync
似乎需要〜5ms /文件......所以〜10秒来区分一组1000个文件。
(我无法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
};
}
于 2013-11-21T05:32:19.330 回答
0
您可以使用StorageFileQueryResult
及其ContentsChanged
事件来通知文件夹及其子文件夹的更改。但是,该事件不包含有关实际更改的任何信息,因此您需要重新解析文件夹并检查您感兴趣的任何内容是否已被修改。
于 2013-03-23T21:04:52.600 回答
0
我认为您无法从您的 Windows 8 应用程序中获取该信息。最好的办法是异步查询文件夹和文件,并将信息与存储在数据库中的信息进行比较。在此处查看枚举文件夹和文件的一个示例。我知道这对于您尝试做的事情不是很有效。如果您发现任何其他更好的方法,请分享。
于 2013-03-22T22:07:24.063 回答
0
这对我有用:
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
}
于 2013-04-16T18:37:14.397 回答