我正在尝试使数据库与Windows 8音乐库保持同步,但我还没有找到有效的解决方案。我知道.NET有一个Windows8应用无法使用的FileSystemWatcher。目前,我的想法是将GetFilesAsync返回的文件列表与我的数据库进行比较,检查是否有修改、删除或添加的内容。我知道这并不理想,但我在Windows.Storage中找不到任何其他有用的东西。我的问题是,一旦音乐库有了修改,我就想自动进行这些更新。当子文件夹中发生更改时,检查文件夹的ModifiedDate是无用的。有没有人知道有没有办法知道StorageFolder什么时候被修改?
发布于 2013-11-21 13:32:19
如果您能够让ContentsChanged可靠地触发,那么下面的代码可能会帮助您确定发生了什么变化。
注意,它并不快。GetBasicPropertiesAsync似乎需要大约5毫秒/文件...所以大约需要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-03-23 06:07:24
我不认为你可以从你的Windows 8应用程序中获取这些信息。最好的办法是异步查询文件夹和文件,并将信息与数据库中存储的信息进行比较。请参阅枚举文件夹和文件here的一个示例。我知道这对于你正在尝试做的事情来说效率不是很高。如果你发现任何其他更好的方法,请分享。
发布于 2013-03-24 05:04:53
您可以使用StorageFileQueryResult及其ContentsChanged事件在文件夹及其子文件夹发生更改时收到通知。但是,该事件不包含任何有关实际更改内容的信息,因此您需要重新解析该文件夹,并检查您感兴趣的内容是否已被修改。
https://stackoverflow.com/questions/15575926
复制相似问题