我正在尝试打开并阅读Windows 8.1中Windows应用商店应用中的文件内容。在大多数情况下,这对我没有问题,但如果文件在Word 2013或Excel中打开,我会得到一个例外:UnauthorizedAccessException - Access is denied
在我看来,必须有一种方法来读取文件,因为Windows 8 Mail应用程序能够发送在Word中打开的同一文件作为电子邮件附件而没有任何问题。
这是我正在使用的代码,它非常简单:
FileOpenPicker filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add("*");
IReadOnlyList<StorageFile> storageFiles = await filePicker.PickMultipleFilesAsync();
foreach (StorageFile storageFile in storageFiles)
{
try
{
using (var stream = await storageFile.OpenReadAsync())
{
}
}
catch (UnauthorizedAccessException e)
{
// Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
}
}
我还尝试了storageFile.OpenReadAsync()
的各种排列,例如OpenStreamForReadAsync
,OpenAsync(FileAccessMode.Read)
,OpenSequentialReadAsync
和FileIO.ReadBufferAsync
,所有这些排列都具有相同的结果。
答案 0 :(得分:2)
我发现访问正在使用的文件的方法是首先将文件复制到本地目录,然后打开一个流到新文件。
所以我最终首先将文件复制到本地TemporaryFolder,然后在复制方法的结果上调用OpenReadAsync()。稍后,我删除了副本,虽然在所有情况下都没有必要,因为Windows应该偶尔删除TemporaryFolder中的文件。
StorageFile tempFile = await storageFile.CopyAsync(ApplicationData.Current.TemporaryFolder, file.Name, NameCollisionOption.GenerateUniqueName);
using (var stream = await tempFile.OpenReadAsync())
{
// Do stuff with the stream.
}
答案 1 :(得分:0)
打开文件时是否尝试过使用“共享选项”?
FileStream fs = new FileStream("FilePath", FileMode.Open, FileAccess.Read, FileShare.Read);
“FileShare.Read”可能是关键。 (没有它我相信默认行为不允许共享读取文件。)