2014-02-14 52 views
0

我试图在Windows 8.1中打开并读取Windows应用商店应用中的文件内容。这是为我工作,而不在大多数情况下一个问题,但如果该文件是在Word 2013或Excel中打开我得到一个异常:UnauthorizedAccessException - Access is denied读取已在Word中打开的文件

在我看来,必须有读取文件的方式,因为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

我发现获得访问使用中的文件的方式是首先将文件复制到本地目录,然后打开一个流到新文件。

因此,我最终将文件复制到本地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. 
} 
0

打开文件时,您是否尝试过使用“共享选项”?

FileStream fs = new FileStream("FilePath", FileMode.Open, FileAccess.Read, FileShare.Read); 

“FileShare.Read”可能是关键。 (没有它,我相信默认行为是不允许共享阅读文件)

+0

我不认为FileStream在WinRT中可用? – grimus

+0

对不起。 (你是对的,FileStream似乎不存在于WinRT中)当我在最初的问题中看到Excel和Word的引用时,我回头讨论了Windows更常见的问题。 (我会看到关于更新我的SO配置文件以排除WinRT) – Wonderbird