UWP应用文件访问被拒求助:FileOpenPicker选文件后读取失败
解决UWP中FileOpenPicker选文件后访问路径被拒绝的问题
我明白你现在卡在哪了——明明通过FileOpenPicker手动选了CSV文件,结果调用File.ReadAllLines(file.Path)时直接触发了"Access to the path is denied"错误。这其实是UWP的沙箱机制在起作用,咱们来理清楚原因并解决它:
问题根源
你查到的"应用可访问用户手动选择的目录和文件"没错,但UWP的权限规则有个关键点:即使是用户手动授权的文件,你也不能直接通过文件路径用System.IO类的API访问。沙箱会严格限制这种直接路径读写的操作,正确的姿势是通过StorageFile对象本身提供的API来操作文件内容。
修改后的可行代码
把你原来的读取逻辑替换成UWP支持的方式就行,这里给你两种常用方案:
public async void CsvParse() { var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.FileTypeFilter.Add(".csv"); Windows.Storage.StorageFile file = await picker.PickSingleFileAsync(); if (file != null) { // 方案1:用UWP内置的FileIO直接读取所有行 IList<string> lines = await Windows.Storage.FileIO.ReadLinesAsync(file); // 若需要转成string[],直接调用ToArray()即可 string[] linesArray = lines.ToArray(); // 方案2:通过流的方式读取(适合复杂处理场景) // using (var stream = await file.OpenStreamForReadAsync()) // using (var reader = new StreamReader(stream)) // { // string fullContent = await reader.ReadToEndAsync(); // string[] linesArray = fullContent.Split(new[] { Environment.NewLine }, StringSplitOptions.None); // } } }
额外提示
另外建议尽量避免用async void(除非是事件处理程序),换成async Task能让代码的错误处理和可维护性更好,比如:
public async Task CsvParse() { // 内部逻辑和上面一致 }
内容的提问来源于stack exchange,提问作者Cruwiel
相关产品推荐
相关产品推荐

