有没有正确的方法来通过其路径获取文件?

时间:2015-12-06 07:53:15

标签: c# windows-10 win-universal-app uwp windows-10-mobile

我在 KnownFolders.VideosLibrary 中有两个同名文件,在这种情况下,我无法通过其名称访问文件,因此它只返回第一个一。因此有没有其他方法来获取解析文件夹中所有文件的其他文件?

// this return two files 
var files = (await KnownFolders.VideosLibrary.GetFilesAsync()).Where(x => x.Name == "test.txt").ToArray();
// with this I can get only one file
StorageFile file = await KnownFolders.VideosLibrary.GetFileAsync("test.txt");
// of course I can parse it with query, but I would like to avoid it
// StorageFile myFile = (await KnownFolders.VideosLibrary.GetFilesAsync()).FirstOrDefault(x => x.FolderRelativeId == "something");

我知道FutureAccessList,但它最多只能容纳1000个文件,这对我来说还不够。

请求后的一些澄清:

例如,让我们考虑使用SD卡在手机上运行该应用。我在手机内存中名称为test.txt视频中有一个文件,视频中的SD卡上也存在同名文件文件夹。

在这种情况下,当您在上面的代码中调用第一行时,您将获得两个文件,以区分它们系统提供 FolderRelativeId ,因此具有相同名称的文件可以存在于一个文件中。位置&#39 ;.如果您查看每个文件夹的完整路径,可能会有C:\Viedos\test.txt和第二个D:\Videos\test.txt

现在,第一次运行的用户选择了一个带有 FilePicker 的文件,并且我已经记住了它的路径,例如D:\Videos\test.txt。在应用程序的第二次运行中,我希望通过使用其路径(或除了有限的 FutureAccessList 之外的其他方法)来访问此文件。在过去,我曾经StorageFile.GetFileFromPathAsync(path);执行此操作 - 似乎它starts throwing UnauthorizedAccessException in W10

4 个答案:

答案 0 :(得分:1)

您可以通过此获取IStorageFile的实例。

// If your have a StorageFile objece file then 
//fileUri = new Uri(file.Path);

string uri = fileUri.LocalPath;
int end = uri.LastIndexOf('\\');
uri = uri.Substring(0, end + 1);

string name = Path.GetFileName(fileUri.LocalPath);
var folder = await StorageFolder.GetFolderFromPathAsync(uri);
IStorageFile file = await folder.GetFileAsync(name);
// Do something with file object

答案 1 :(得分:0)

根据MS的this文档,应用可以选择退出允许将文件存储在SD卡上。因此,媒体库可以分散在设备的内部存储和SD卡

如果我做对了,你的解决方案就是:

  • 选择上述功能
  • 您现在应该只搜索本地设备,而不是SD卡
    • 这将在每个目录中生成唯一的文件名
  • 如果您的用例需要在SD卡上搜索文件,您现在必须access the SD card,并在此处查询文件

我不确定,如果单独访问SD卡的编码开销,仅通过查询本地存储来获得性能提升。

答案 2 :(得分:0)

当您在Windows 8.1应用程序中打开带有文件选择器的文件时(我假设Windows 10以相同的方式工作),您将获得一个持续一段时间的文件夹的权限令牌,或者直到你退出了申请。重新打开应用程序时,必须重新获取该文件夹的标记。

阅读有关StorageApplicationPermissions对象的文章。

答案 3 :(得分:0)

我想通过考虑您无法访问应用中的根驱动器号来调用UnauthorizedAccessException时,可以合理化StorageFile.GetFileFromPathAsync(path)抛出的var file = (await KnownFolders.VideosLibrary.GetFilesAsync()).FirstOrDefault(x => x.Path == "D:\Videos\test.txt"); ,因此导航文件夹结构的方式是不允许。这是一个猜测。

至于你的问题,为什么你不能这样做?

D:\Videos\test.txt

其中.Path是您从用户使用选择器选择的文件中抓取的$ cordova plugin add cordova.plugins.diagnostic 属性值。

如果在VideosLibrary上有数百万个文件,也许你会发现它会慢一些。