将文件路径值传递给OpenXML GetCellValue()时发生System.IO.FileNotFound

时间:2019-06-25 13:54:59

标签: c# openxml filepicker

当我将值从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时也会发生此问题

1 个答案:

答案 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,以完全避免此问题。