[英]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.