C# 如何浏览Windows 10应用程序中的相邻文件?

C# 如何浏览Windows 10应用程序中的相邻文件?,c#,windows-store-apps,filesystems,C#,Windows Store Apps,Filesystems,我尝试将照片编辑器/查看器作为Windows 10应用程序。我允许用户通过FileOpenPicker打开图像文件。该程序还应能够浏览与所选文件相同文件夹中的其他图像(例如,通过“上一步”和“下一步”按钮),但存在问题。我甚至不能得到这些图像的文件名 我尝试过的所有方法都只返回null // File picker to let user select the image file - works OK var picker = new Windows.Storage.Pickers.FileO

我尝试将照片编辑器/查看器作为Windows 10应用程序。我允许用户通过
FileOpenPicker
打开图像文件。该程序还应能够浏览与所选文件相同文件夹中的其他图像(例如,通过“上一步”和“下一步”按钮),但存在问题。我甚至不能得到这些图像的文件名

我尝试过的所有方法都只返回
null

// File picker to let user select the image file - works OK
var picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.FileTypeFilter.Add(".jpg"); 
var file = await picker.PickSingleFileAsync();  

// These methods to get neighboring files do not work
// 1. using Directory.GetFiles - it returns empty string
string filePaths[] = Directory.GetFiles(Path.GetDirectoryName(file.Path));
// 2. using GetParentAsync - it returns null instead of file's parent folder
var folder = await file.GetParentAsync();
var files = await folder.GetFilesAsync();
那么,如何浏览与已打开文件相同文件夹中的其他文件呢

我发现我可以使用
FolderPicker
来访问给定的文件夹,但是如果用户需要通过两个选择器(一个用于图像文件,另一个用于实际文件的文件夹),那么这将是一个非常愚蠢的解决方案


编辑:在我选中应用程序清单中的Removable Storage和Picture Library后,
GetParentAsync
开始对USB驱动器工作,但当我从任何本地驱动器打开图像文件时,它仍然返回null。为什么它不适用于本地硬盘驱动器,而本地硬盘驱动器是存储大量照片的逻辑存储设备?仅将数据存储到小型SSD系统驱动器或USB驱动器上的用户文件夹非常有限。

您从
文件OpenPicker
获得了一个
存储文件。您可以使用
GetParentAsync
方法获取包含的文件夹,然后调用
getfileasync
获取文件夹中的文件

var folder = await file.GetParentAsync();
var files = await folder.GetFilesAsync();
var next = files.SkipWhile(x => x.Name == file.Name)
                .Skip(1)
                .First();
如您所见,您可以获得文件夹中的下一个文件,在找到当前文件之前跳过ech文件。然后跳过它,在你的文件后面取第一个

我认为在访问文件之前,最好分别调用
OrderBy
文件
结果进行排序。

您可以传递lambda表达式来选择要排序的属性或值。

基本上,如果用户通过FilePicker选择“文件”,则您只有“文件”的权限。不适用于父文件夹。(如果您具有图片库的访问权限,并且文件位于库中,则可以访问文件夹。但是,权限来自库访问,而不是文件。)

这是WinRT通过FileBroker访问文件规则的设计。。这很难克服

我的建议(以及许多storeapp picture viewer选择这种方式,包括我的应用程序PICT8)是,请用户使用FolderPicker设置用户主要用于保存图像文件的文件夹。 您可以使用FAL或MRU保留文件夹的访问权限。您可以向用户显示文件列表,而不是使用FilePicker


另外,我对另一个线程的回答也可能对您有所帮助:

谢谢您的回复,但即使是GetParentAsync(),它在大多数情况下都返回null,我也有一个大问题。实际上,它只适用于我的USB驱动器,但不适用于任何其他位置(例如,当我从本地驱动器D打开文件时:我存储所有照片的地方)。因此,我需要使GetParentAsync适用于所有情况。@MichalDvorak我还无法测试它,但请确保您在应用程序清单中启用了所有必要的权限。我检查了应用程序清单中的功能,但我只能启用图片库和可移动存储。似乎没有办法让GetParentAsync()为本地驱动器工作。这是一个巨大的耻辱,因为我认为许多用户(包括我)将他们的照片存储在一个大的HDD上,而不是存储在小型SSD上的任何windows图片文件夹中,该SSD只用于系统和程序。