Xamarin Forms UWP应用保存Sharepoint下载文件到本地后偶发被锁定问题
问题根因
核心问题是你创建的本地文件流没有被正确释放。你只对从Graph API获取的下载流做了释放处理,通过File.Create()返回的本地文件流对象driveItemFile始终没有被释放,文件句柄一直被当前应用持有,所以外部访问时会触发占用报错。你之前加的释放逻辑都只针对下载流,没有覆盖本地文件流,因此没有效果。
修复方案
推荐给本地文件流也套上using语句块,不需要手动写Dispose/Close逻辑,using会在代码块结束后自动释放资源,即使中间出现异常也能保证资源正常释放。
修复后的代码如下:
try { using (var stream = await App.GraphClient.Sites[TestSiteId].Drive.Items[listItemAsDriveItem.DriveItem.Id].Content.Request().GetAsync()) { var driveItemPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), listItemAsDriveItem.DriveItem.Name); // 给本地文件流加using块,执行结束后自动释放句柄 using (var driveItemFile = System.IO.File.Create(driveItemPath)) { stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(driveItemFile); // 下载流已经由外层using自动释放,删除冗余的手动Dispose调用 } } DisplayAlert("Download", listItemAsDriveItem.DriveItem.Name + " successfully downloaded", "OK"); } catch (Exception ex) { Console.WriteLine("Download failed with: " + ex.Message); DisplayAlert("Error", listItemAsDriveItem.DriveItem.Name + " failed with: " + ex.Message, "OK"); }
如果不想用嵌套using,也可以在CopyTo执行完成后手动调用driveItemFile.Dispose()释放资源,优先推荐using写法,容错性更高。
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

