как получить байты файла для отправки в UWP? - PullRequest
0 голосов
/ 02 октября 2018

Я новичок в UWP и хочу открыть файл любого типа и передать его байты получателю.Например, для файла jpg я написал этот код:

// Create FileOpenPicker instance    
FileOpenPicker fileOpenPicker = new FileOpenPicker();

// Set SuggestedStartLocation    
fileOpenPicker.SuggestedStartLocation =         PickerLocationId.PicturesLibrary;

// Set ViewMode    
fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
fileOpenPicker.FileTypeFilter.Clear();
fileOpenPicker.FileTypeFilter.Add(".jpg");

// Open FileOpenPicker    
StorageFile file = await fileOpenPicker.PickSingleFileAsync();
byte[] bytesRead = File.ReadAllBytes(file.Path);

 string  Paths = 
 @"C:\\Users\zahraesm\Pictures\sample_reconstructed.jpg";
 File.WriteAllBytes(Paths, bytesRead);           

две последние строки - для записи байтов в файл, предполагаемый в приемнике.Однако я продолжаю получать следующее исключение:

System.InvalidOperationException: «Синхронные операции не должны выполняться в потоке пользовательского интерфейса.Попробуйте обернуть этот метод в Task.Run. '

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Вы должны непосредственно прочитать байты из StorageFile, возвращенного из FilePicker, чтобы в будущем не возникли ошибки разрешения доступа к файлу.

StorageFile file = await fileOpenPicker.PickSingleFileAsync();
var buffer = await FileIO.ReadBufferAsync(file);
byte[] bytes = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray(buffer);

Вы также должны использовать await FileIO.WriteBytesAsync(targetFile, myBytes) для записи.

Если у вас нет broadFileSystemAccess в вашем пакете Manifest, вы, как правило, должны избегать использования System.IO API, если только вы не знаете, что ваше приложение явно имеет разрешение на доступ к файлам в этой области (т. Е. В локальном хранилище вашего приложения), и вместо этогоиспользуйте Windows.Storage API

Проверьте MSDN для Разрешения доступа к файлу для приложений UWP для получения дополнительной информации о разрешениях файла.

И если вы используете System.IO, всегда выполняйтеработа в фоновом потоке через await Task.Run(() => { ... }

0 голосов
/ 03 октября 2018

Попробуйте этот код.

try {
            FileOpenPicker openPicker = new FileOpenPicker {
                ViewMode = PickerViewMode.Thumbnail,
                SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
                FileTypeFilter = { ".jpg", ".jpeg", ".png" }
            };

            StorageFile file = await openPicker.PickSingleFileAsync();
            if (file != null) {
                using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read)) {
                    var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));

                    var LoadReader = await reader.LoadAsync((uint)fileStream.Size);

                    byte[] pixels = new byte[fileStream.Size];
                    reader.ReadBytes(pixels);
                }
            }
        } catch (Exception ex) {

        }
0 голосов
/ 02 октября 2018

рассмотрим перенос последней операции в Task.Run ()

await Task.Run(()=>{
    byte[] bytesRead = File.ReadAllBytes(file.Path);        
    string  Paths = 
    @"C:\\Users\zahraesm\Pictures\sample_reconstructed.jpg";
    File.WriteAllBytes(Paths, bytesRead); 
});
...