在驱动器根目录中的文件上使用FileInfo时,System.IO异常

时间:2018-12-21 03:04:20

标签: c# file-io uwp

我正在使用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);

我已启用可移动设备功能,由于可以看到这些设备,因此我可以确认它正在工作。

我会想到一个关于没有驱动器权限的错误,但是尝试获取文件长度时出现“参数不正确”肯定是奇怪的!

1 个答案:

答案 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名称空间中。这就是为什么我说这不是一个奇怪的问题。