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

时间:2014-05-18 16:06:21

标签: c# windows-8 windows-8.1 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

我做错了什么或是否有其他快速方法来检查用户是否添加了新音乐?

3 个答案:

答案 0 :(得分:2)

KnownFolders.MusicLibraryvirtual location。因此,我认为,获取其属性可能是一个问题。

另一个问题是DateModified可能是一个坏主意,因为当用户添加文件时它可能保持不变。你无法接力。 (some information)。您可以检查一下 - 当我尝试移动文件夹中的文件时,DateModified没有更改。

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

由于FileSeeries尚不适用于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;
}

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

答案 1 :(得分:0)

您可以改为检查文件夹大小:

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;
}

答案 2 :(得分:0)

加入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;
        }