繁体   English   中英

检查用户是否在Windows Phone 8.1上添加了新音乐

[英]Check if user added new music on Windows Phone 8.1

我试图找出用户是否在手机上的音乐文件夹中添加了新音乐,因为应用上次使用了该应用。

我尝试通过检查音乐文件夹的DateModified(在向手机添加新音乐时在计算机上正确更新)来执行此操作:

async void GetModifiedDate ()
{
    BasicProperties props = await KnownFolders.MusicLibrary.GetBasicPropertiesAsync();
    Debug.WriteLine("DATEMODIFIED: " + props.DateModified.ToString());
}

不幸的是,这回归

DATEMODIFIED: 1/1/1601 1:00:00 AM +01:00

我做错了还是有另一种快速方法来检查用户是否添加了新音乐?

KnownFolders.MusicLibrary是一个虚拟位置 因此,我认为,获得其属性可能是一个问题。

另一个问题是DateModified可能是个坏主意,因为当用户添加文件时它可能保持不变。 你无法接力。 一些信息 )。 你可以检查一下 - 当我试图在文件夹中移动文件时,他们的DateModified没有改变。

所以在这种情况下,我担心你必须在MusicLibrary中列出你的文件,然后决定保存什么以供将来比较。 文件大小的总和可能是个好主意,因此两个不同的音乐文件大小相同的可能性很小。 如果用户已将文件从一个文件夹移动到另一个文件夹(总大小不会更改),则还需要通知您。 如果你想确保更多,你可以记住Tuple<file.FolderRelativeId, fileSize>的整个列表(对于ecample)。

由于FileQueries尚不适用于Windows Phone,因此您必须以递归方式检索文件,简单代码可能如下所示:

// first - a method to retrieve files from folder recursively 
private async Task RetriveFilesInFolder(List<StorageFile> list, StorageFolder parent)
{
    foreach (var item in await parent.GetFilesAsync()) list.Add(item);
    foreach (var item in await parent.GetFoldersAsync()) await RetriveFilesInFolder(list, item);
}

private async Task<List<StorageFile>> GetFilesInMusic()
{
    StorageFolder folder = KnownFolders.MusicLibrary;
    List<StorageFile> listOfFiles = new List<StorageFile>();
    await RetriveFilesInFolder(listOfFiles, folder);
    return listOfFiles;
}

获得文件列表后,您可以决定要记住哪些内容,以便在下次应用启动时进行进一步比较。

您可以检查文件夹大小:

ulong musicFolderSize = (ulong)ApplicationData.Current.LocalSettings.Values["musicFolderSize"];

BasicProperties props = await KnownFolders.MusicLibrary.GetBasicPropertiesAsync();
if (props.Size != musicFolderSize)
{
    //  ...
    ApplicationData.Current.LocalSettings.Values["musicFolderSize"] = props.Size;
}

加入Romansz的答案:

保证您知道文件更改的唯一方法是跟踪设备上的文件,然后比较启动之间是否有变化。

获取所有文件的更懒惰的方法是使用KnownFolders.MusicLibrary.GetFilesAsync(CommonFileQuery.OrderByName); 这是默认的深度查询。 它将在一个查询中获取所有文件,但在大型目录上可能非常慢。 然后,您必须翻阅所有文件,如图所示

        //cache the virtual storage folder for the loop
        StorageFolder musicLibrary = KnownFolders.MusicLibrary; 
        uint stepSize= 50;
        uint startIndex = 0;
        while (true)
        {
            IReadOnlyList<StorageFile> files = await musicLibrary.GetFilesAsync(CommonFileQuery.OrderByName,startIndex,stepSize);

            foreach (var file in files)
            {
                //compare to see if file is in your list
            }
            if (files.Count < stepSize) break; 
            startIndex += stepSize;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM