UWP 如何访问文件夹中的文件

Chi*_*ips 1 file uwp

请帮助我,我无法访问我通过 FileOpenPicker 选择的文件。

FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.Desktop;
openPicker.CommitButtonText = "???????";
openPicker.FileTypeFilter.Add(".xlsx");
var file = await openPicker.PickSingleFileAsync();

using (FileStream fs = new FileStream(file.Path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{

}

Run Code Online (Sandbox Code Playgroud)

怎么了?

Pin*_*ing 5

由于 UWP 沙箱如何访问文件系统,您无法FileStream直接从 aStorageFile的路径构造 a 。相反,您有几个选择,从最简单到最复杂:

1)如果您的文件足够小,您可以使用FileIO静态类中的助手一次读取所有文件:

string text =  await FileIO.ReadTextAsync(file); // or ReadLinesAsync or ReadBufferAsync, depending on what you need
Run Code Online (Sandbox Code Playgroud)

2)使用OpenAsync()StorageFile上的方法:

using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read, StorageOpenOptions.AllowReadersAndWriters)) 
{
     // your reading code here
}
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以使用、和扩展方法在IRandomAccessStream和 .NET之间进行转换,其文档在此处StreamAsStream()AsStreamForRead()AsStreamForWrite()IRandomAccessStream

3)如果你想完全控制,你可以使用 获取SafeFileHandle底层文件CreateSafeFileHandle(),如下所示:

SafeFileHandle fileHandle = file.CreateSafeFileHandle(FileAccess.Read, FileShare.ReadWrite);
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此文件句柄来创建标准FileStream

using (FileStream fs = new FileStream(fileHandle, FileAccess.Read))
{
     // Read stuff here
}
Run Code Online (Sandbox Code Playgroud)

这是在FileStreamUWP 上可靠地使用 a 的唯一方法StorageFile,应谨慎使用。官方文档有更多关于这样做的影响的细节。