1

我是 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: '不应在 UI 线程上执行同步操作。考虑将此方法包装在 Task.Run 中。

4

3 回答 3

1

试试这个代码。

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) {

        }
于 2018-10-03T04:09:45.020 回答
0

您应该直接从 FilePicker 返回的 StorageFile 中读取字节,以免将来出现文件权限错误。

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.IOAPI,除非您知道您的应用程序明确有权访问该区域(即您的应用程序的本地存储)中的文件,而是使用Windows.StorageAPI 的

有关文件权限的详细信息,请查看 MSDN 以获取 UWP 应用程序的文件访问权限。

如果您确实使用System.IO,请始终通过后台线程执行工作await Task.Run(() => { ... }

于 2018-10-02T12:10:07.757 回答
0

考虑将最后一个操作包装在Task.Run()

await Task.Run(()=>{
    byte[] bytesRead = File.ReadAllBytes(file.Path);        
    string  Paths = 
    @"C:\\Users\zahraesm\Pictures\sample_reconstructed.jpg";
    File.WriteAllBytes(Paths, bytesRead); 
});
于 2018-10-02T11:37:49.970 回答