当我将值从OpenFilePicker()方法传递回按钮click方法时,我可以利用调试字符串并确保该值不为null。
但是,当我将其传递给GetCellValue()方法时,将引发“ FileNotFound”异常。在此处使用调试语句还显示该值不为null,并返回有效的文件路径“ C:\ Test.xlsx”。
尝试将所有文件夹的文件权限更改为RWX,尝试使用不同的文件夹位置。所有权限和文件夹似乎都存在相同的问题。
public async void FileSelectButton_ClickAsync(object sender, RoutedEventArgs e)
{
string filePath = await openFilePicker();
//Debug.WriteLine("result:: " + filePath);
GetCellValue(filePath, "Sheet1", "A1");
}
public async Task<string> openFilePicker()
{
var archerReportPicker = new
Windows.Storage.Pickers.FileOpenPicker();
archerReportPicker.ViewMode =
Windows.Storage.Pickers.PickerViewMode.Thumbnail;
archerReportPicker.SuggestedStartLocation =
Windows.Storage.Pickers.PickerLocationId.Downloads;
archerReportPicker.FileTypeFilter.Add(".xlsx");
archerReportPicker.FileTypeFilter.Add(".xls"); // Default extensions
Windows.Storage.StorageFile archerReport = await archerReportPicker.PickSingleFileAsync(); //Get file
if (archerReport != null)
{
// Application now has read/write access to the picked file
this.fileTextBox.Text = archerReport.Name; // Load it up and throw the data in the textbox.
var filePath = archerReport.Path;
return filePath;
}
else
{
this.fileTextBox.Text = "";
return null;
}
}
public static string GetCellValue(string fileName, string sheetName, string addressName)
{
string value = null;
// Open the spreadsheet document for read-only access.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false)) //Line where exception is thrown
{...}
抛出System.IO.FileNotFound异常,而不是打开有效的文件路径。
使用const string '@c:\test.xlsx'
定义filePath或fileName时也会发生此问题
答案 0 :(得分:0)
此问题的简短答案在这里:
https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/
要点在于,在UWP中,存储选择器返回一个非文件系统绑定的Windows.Storage对象。您可以从对象中收集文件系统路径 ,但是由于您正在对第二个对象执行操作,因此用户授予第一个对象权限的事实不适用到第二秒,即使试图打开文件,即使NTFS权限允许“所有人”访问,也会导致访问被拒绝的情况。
这可以通过使用SystemInternals的Process Monitor监视应用程序来确认。
如果我找到解决此问题的方法,则将更新此答案,但是我可能会从UWP转向Windows Forms Application,以完全避免此问题。