首页 > 解决方案 > 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))
{

}

怎么了?

标签: fileuwp

解决方案


由于 UWP 沙箱访问文件系统的方式,您不能FileStream直接从 aStorageFile的路径构造 a 。相反,您有几个选项,按从最简单到最复杂的顺序排列:

1)如果您的文件足够小,您可以使用FileIO静态类中的帮助程序一次读取它:

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

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

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

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

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

SafeFileHandle fileHandle = file.CreateSafeFileHandle(FileAccess.Read, FileShare.ReadWrite);

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

using (FileStream fs = new FileStream(fileHandle, FileAccess.Read))
{
     // Read stuff here
}

FileStream这是在UWP 上可靠使用 a 的唯一方法StorageFile,应谨慎使用。官方文档有更多关于这样做的含义的详细信息。


推荐阅读