System.IO.FileNotFound при передаче значения пути к файлу в OpenXML GetCellValue () - PullRequest
0 голосов
/ 25 июня 2019

Когда я передаю значение из метода OpenFilePicker () обратно в метод нажатия кнопки, я могу использовать строку отладки и убедиться, что значение не равно нулю.

Однако, когда я передаю его методу GetCellValue (), возникает исключение FileNotFound. Использование здесь команды отладки также показывает, что значение не равно нулю, и возвращает правильный путь к файлу «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 вместо открытия допустимого пути к файлу.

Эта проблема также возникает, когда filePath или fileName определены с помощью const string '@c:\test.xlsx'

1 Ответ

0 голосов
/ 25 июня 2019

Краткий ответ на этот вопрос здесь:

https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/

Суть в том, что в UWP средства выбора хранилища возвращают объект Windows.Storage, не связанный с файловой системой. Вы можете получить путь к файловой системе из объекта , но поскольку вы выполняете операцию над вторичным объектом , тот факт, что пользователь дал разрешения для первого объекта, не относится к во-вторых, приводя к условию «Отказано в доступе» при попытке открыть файл - даже если разрешения NTFS разрешают доступ «Все».

Это можно подтвердить мониторингом приложения с помощью Process Monitor из SystemInternals.

Если я найду способ обойти эту проблему, я обновлю этот ответ, но, скорее всего, я перейду от UWP обратно к приложению Windows Forms, чтобы полностью избежать этой проблемы.

...