我正在使用UWP技术创建文件浏览器。
我本来以为我看不到特定可移动驱动器上的文件,但事实证明,驱动器根文件夹中的任何内容都会抛出System.IOException
我可以看到其他驱动器并访问它们的属性,但是当我读取其中一个的Length
时,它将引发以下异常:
System.IO.IOException:参数不正确 在System.IO.WinRTIOExtensions.d__2`1.MoveNext() ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在System.IO.WinRTFileSystem.WinRTFileSystemObject.d__25.MoveNext() ---从之前引发异常的位置开始的堆栈结束跟踪--- 在System.IO.WinRTFileSystem.WinRTFileSystemObject.EnsureItemInitialized() 在System.IO.WinRTFileSystem.WinRTFileSystemObject.get_Attributes() 在System.IO.FileInfo.get_Length() 在Traverse.MainPage上。<> c__DisplayClass9_0.b__0()
以下是破坏代码:
Task.Run(() => {
Debug.WriteLine(path);
FileInfo fileInfo = new FileInfo(path);
Debug.WriteLine(fileInfo.FullName);
Debug.WriteLine(fileInfo.Length);
});
输出:
D:\bitmap-machine.html
D:\bitmap-machine.html
(The long error message from above)
更多代码将触发问题:
FileInfo f = new FileInfo(@"C:\ReadMe.txt");
Debug.WriteLine(f.Length);
一些不会触发问题的代码:
FileInfo f = new FileInfo(@"C:\PHP\php.gif");
Debug.WriteLine(f.Length);
我已启用可移动设备功能,由于可以看到这些设备,因此我可以确认它正在工作。
我会想到一个关于没有驱动器权限的错误,但是尝试获取文件长度时出现“参数不正确”肯定是奇怪的!
答案 0 :(得分:1)
根据我们在上面评论中的讨论,我在这里回复了。
如果使用“ broadFileSystemAccess”功能,则需要调用Windows.Storage API。
System.IO可用,没有任何过时的注意事项,它在驱动器的根目录以外的所有地方都可以使用。我只是说,因为存在可行的替代方案并不意味着这不是一个奇怪的问题,除非这种行为是故意的
这是一个漫长的故事。 UWP与传统的桌面应用程序不同。 UWP应用程序使用Windows运行时API,而桌面应用程序使用.Netframework API。例如,如果您很久以前就开始开发UWP,例如,如果您知道Universal Windows 8.1应用程序,则可以将其称为UWP8.1应用程序。在UWP 8.1中,我们只能调用Windows运行时API,FileInfo
类API和其他.Netframework API在UWP 8.1中不支持。编程时我们甚至找不到此类。
然后,随着Windows 10(10240)的发布,引入了UWP(通用Windows平台)。您可以尝试将项目的目标版本切换为10240。这时,受益于.Net标准,我们可以在编程时找到一些经典的.Netframework API,例如FileInfo
类,但仍然无法调用此API成功。这是因为所有UWP应用程序都运行沙盒并且对文件系统的访问非常有限。 FileInfo
类API在UWP 10240中仍然不支持。如果选中.NET API Browser,则可以看到FileInfo
类可从.Net Standard 1.6中获得。在UWP 16299之前,与此table一起来看,UWP仅支持.Net Standard 1.4和早期版本。
从16299开始,UWP支持.Net Standard 2.0。此版本使UWP与其他支持.NET Standard 2.0的.NET实现成为一体。但正如我所说,UWP应用程序运行沙盒,并且对文件系统的访问非常有限。如果您想调用FileInfo
类API从应用容器外部访问文件,则仍然不允许。
鉴于此,从17134开始引入了受限功能broadFileSystemAccess
。添加此功能后,您不仅可以获取应用程序容器,还可以获取用户有权访问的所有文件。例如:文档,图片,照片,下载,桌面,OneDrive等。但是前提是必须使用Windows Storage名称空间API。如果您检查文档,则FileInfo
类将不包含在Windows.Stroage
名称空间中。这就是为什么我说这不是一个奇怪的问题。