Open sunl158 opened 1 year ago
在wasm上StorageFile由uno实现
async void OpenFile(object sender, RoutedEventArgs e)
{
var filePicker = Kit.GetFileOpenPicker();
filePicker.FileTypeFilter.Add(".xls");
filePicker.FileTypeFilter.Add(".xlsx");
filePicker.FileTypeFilter.Add(".xml");
StorageFile storageFile = await filePicker.PickSingleFileAsync();
if (storageFile != null)
{
var stream = await storageFile.OpenStreamForReadAsync();
if (storageFile.FileType.ToLower() == ".xml")
await _excel.OpenXml(stream);
else
await _excel.OpenExcel(stream, GetOpenFlag());
stream.Dispose();
}
}
最终提供给IsLegal(Stream stream)
的类型为Uno.Storage.Streams.Internal.RentedStream
,内部stream类型为Uno.Storage.Streams.Internal.NativeReadStream
,参见:https://github.com/unoplatform/uno/blob/4c3f809ed5ebe7837e28b91fca4b0b4cc476a8e8/src/Uno.UWP/Storage/Streams/Internal/NativeReadStream.wasm.cs#L68
未实现Read同步方法,而BinaryReader未提供异步方法!
不只是此一处,后续所有文件流的读取都会出错!
Dt.Xls是稳定的不会大调整。
目前要实现该功能只能从选择文件后的Stream类型下手!
Dt.Xls\Biff\CompoundFile.cs public static bool IsLegal(Stream stream) { bool flag = false; BinaryReader reader = new BinaryReader(stream); try { ulong num = reader.ReadUInt64(); if (num == 16220472316735377360L) flag = true; } catch(Exception ex) { This stream is asynchronous-only' } reader.BaseStream.Seek(0L, (SeekOrigin) SeekOrigin.Begin); return flag; }