识别StorageFolder中的文件更改

时间:2013-03-22 16:57:34

标签: windows-8 windows-runtime windows-store-apps

我正在尝试让数据库与Windows 8音乐库保持同步,我还没有找到一个有效的解决方案。我知道.NET有FileSystemWatcher,Windows 8应用程序无法使用它。目前,我的想法是将GetFilesAsync返回的文件列表与我的数据库进行比较,并检查某些内容是否已被修改,删除或添加。我知道这不理想,但我在Windows.Storage中找不到任何其他有用的东西。我的问题是,一旦对音乐库进行了修改,我想自动进行这些更新。当子文件夹中发生更改时,检查文件夹的ModifiedDate是无用的。有没有人知道是否有办法告诉我StorageFolder何时被修改?

4 个答案:

答案 0 :(得分:1)

如果您能够可靠地触发ContentsChanged,那么下面的代码可以帮助您确定更改内容。

注意,它并不快。 GetBasicPropertiesAsync似乎需要〜5ms / file ...所以~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
        };
    }

答案 1 :(得分:0)

我认为您无法从Windows 8应用中获取该信息。最好的办法是异步查询文件夹和文件,并将信息与存储在数据库中的信息进行比较。请参阅枚举文件夹和文件here的一个示例。我知道这对你要做的事情来说效率不高。如果您发现其他更好的方法,请分享。

答案 2 :(得分:0)

您可以使用StorageFileQueryResult及其ContentsChanged事件来通知文件夹及其子文件夹的更改。但是,该事件不包含任何实际更改的信息,因此您需要重新解析该文件夹并检查您感兴趣的内容是否已被修改。

答案 3 :(得分: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
    }
相关问题