读取已在Word中打开的文件

时间:2014-02-14 17:17:57

标签: c# windows-runtime windows-8.1

我正在尝试打开并阅读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()的各种排列,例如OpenStreamForReadAsyncOpenAsync(FileAccessMode.Read)OpenSequentialReadAsyncFileIO.ReadBufferAsync,所有这些排列都具有相同的结果。

2 个答案:

答案 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”可能是关键。 (没有它我相信默认行为不允许共享读取文件。)