首页 > 解决方案 > uwp NeighbourFilesQuery 有时会给出 System.OverflowException

问题描述

我使用File​ActivatedEvent​Args args在我的视频播放器应用程序中进行文件关联。因此,当用户双击打开的视频文件并在我的应用程序中播放该文件时,它还会获取所有相邻文件,因此我也可以将它们添加到播放列表中。为此,我使用以下代码。

var file=args.Files[0]; 
StorageFileQueryResult neighboringFilesQuery=args.NeighboringFilesQuery;
var startingIndexunit = await neighboringFilesQuery.FindStartIndexAsync(file);
int startingIndex = Convert.ToInt32(startingIndexunit); //this is where exception occurs

并非总是如此,但有时当我打开一个文件时,我会得到一个System.OverFlowException,因为代码试图将一个非常大的垃圾号输入int32,这会导致异常。

经过进一步调查,我发现通常当我双击一个文件并获取邻居文件时,我会获取NeighborFilesQuery中的所有文件(包括我单击打开的 1 个文件),所以我可以找到它的索引,这样我就可以设置起始索引在我的应用程序中播放我的播放列表,并在正确的位置播放单击的文件。

但在其他一些情况下,例如当我打开一个.flv或某个.rm文件时,我会在 neighborfilesQuery 中获得所有邻居文件,但没有获得我单击的文件,因此当代码尝试获取该文件的索引时文件,该文件在该列表中不存在,因此我得到一个垃圾索引。

那么为什么这个 api 如此不一致呢?有时它在查询文件列表中包含单击的文件,有时它不包含?

请注意,我在这里只讨论单个文件单击的场景,而不是一起打开的多个文件(因为在这种情况下,文件查询应该是空的,这是一个不同的场景)。

标签: c#xamluwpstoragefileoverflowexception

解决方案


根据文档,当 FindStartIndexAsync 时,您应该期望看到 uint.MaxValue。 https://docs.microsoft.com/en-us/uwp/api/windows.storage.search.storagefilequeryresult.findstartindexasync

如果我们在此处查看 NeighboringFilesQuery 文档:https ://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.activation.fileactivatedeventargs.neighboringfilesquery ,我们会发现它不适用于所有调用。我们还会注意到 NeighboringFileQuery 中没有显示任何 mp4 文件,因此当我们通过单击 mp4 激活时,该 mp4 仍然不在 NeighboringFileQuery 列表中。当您调用获取索引时,它返回 uint.MaxValue 因为请求的文件不在查询中。尝试将其转换为 Int32 时,由于溢出而发生异常。

对于这种情况,您需要在转换/转换为 Int32 之前检查 uint.MaxValue。您还应该捕获任何可能发生的异常,因为您将获得任何大于 int.MaxValue 的值的溢出。


推荐阅读