UWP как получить доступ к файлу в папке - PullRequest
0 голосов
/ 31 марта 2020

Помогите мне, пожалуйста, я не могу получить доступ к файлу, который я выбираю с помощью 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))
{

}

Что не так?

Ответы [ 3 ]

3 голосов
/ 31 марта 2020

Из-за того, что песочницы UWP получают доступ к файловой системе, вы не можете создать FileStream непосредственно из пути StorageFile. Вместо этого у вас есть несколько вариантов, от самого простого до самого сложного:

1) Если ваш файл достаточно мал, вы можете просто использовать помощники в классе FileIO stati c, чтобы прочитать его все сразу:

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 Stream s с методами расширения AsStream(), 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 StorageFile, и его следует использовать с некоторой осторожностью. Официальные документы имеют более подробную информацию о последствиях этого .

1 голос
/ 31 марта 2020

FileOpenPicker дает вам StorageFile, который оборачивает открытые файлы и дает вам разрешение на это. Это не дает вам доступа к файлу в целом - например, вы не можете использовать Path только для открытия его с помощью FileStream. Вместо этого вам нужно использовать соответствующие Windows.Storage API для этого. Я обычно использую метод расширения OpenStreamForReadAsync. Добавьте using System.IO к заголовку файла и затем:

var stream = await file.OpenStreamForReadAsync();

Этот метод возвращает System.IO.Stream, который можно использовать с API-интерфейсами, включенными в classi c System.IO.

0 голосов
/ 31 марта 2020

Пожалуйста, избегайте использования файла Path для доступа к потоку файлов на платформе 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();
if (file != null)
{      
 var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
}

И если вам нужно использовать поток в System.IO пространстве имен. пожалуйста, вызовите AsStream метод для IRandomAccessStream объекта.

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
System.IO.Stream iostream = stream.AsStream();

Для более подробной информации, пожалуйста, обратитесь к этому официальному документу .

...