You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:27:01