xamarin 形成 UWP 应用程序 - 在本地保存文件后,有时它会锁定
xamarin forms UWP app - after saving a file locally, sometimes it locks
背景信息
我有一个 c# xamarin 表单应用程序,我允许用户从 Sharepoint 下载文件。我正在将流保存到 windows 桌面上的本地文件夹。下载完成后,我希望用户能够单击文件并将其打开。目前,当我尝试打开该文件时,出现错误提示该文件正在被另一个应用程序或用户使用。
下载本身似乎运行良好。
代码如下:
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);
var driveItemFile = System.IO.File.Create(driveItemPath);
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(driveItemFile);
stream.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{}”语句中。
我还明确调用 stream.Dispose();
我还尝试用 Close() 替换对 .Dispose 的调用,但这也没有区别。
您尝试过使用 FileStream
吗?
try
{
var driveItemPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), listItemAsDriveItem.DriveItem.Name);
using (var stream = await App.GraphClient.Sites[TestSiteId].Drive.Items[listItemAsDriveItem.DriveItem.Id].Content.Request().GetAsync())
using (var fs = new FileStream(driveItemPath, FileMode.Create, FileAccess.Open))
{
var driveItemFile = System.IO.File.Create(driveItemPath);
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(fs);
}
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");
}
问题是 driveItemFile
也是一个流,但它不是 disposed/closed,它是创建和锁定文件的实际流
背景信息
我有一个 c# xamarin 表单应用程序,我允许用户从 Sharepoint 下载文件。我正在将流保存到 windows 桌面上的本地文件夹。下载完成后,我希望用户能够单击文件并将其打开。目前,当我尝试打开该文件时,出现错误提示该文件正在被另一个应用程序或用户使用。
下载本身似乎运行良好。
代码如下:
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);
var driveItemFile = System.IO.File.Create(driveItemPath);
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(driveItemFile);
stream.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{}”语句中。 我还明确调用 stream.Dispose(); 我还尝试用 Close() 替换对 .Dispose 的调用,但这也没有区别。
您尝试过使用 FileStream
吗?
try
{
var driveItemPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), listItemAsDriveItem.DriveItem.Name);
using (var stream = await App.GraphClient.Sites[TestSiteId].Drive.Items[listItemAsDriveItem.DriveItem.Id].Content.Request().GetAsync())
using (var fs = new FileStream(driveItemPath, FileMode.Create, FileAccess.Open))
{
var driveItemFile = System.IO.File.Create(driveItemPath);
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(fs);
}
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");
}
问题是 driveItemFile
也是一个流,但它不是 disposed/closed,它是创建和锁定文件的实际流