私は現在、ログファイルをロードし、DevExpress XtraGrid に表示されるように処理するサンプル Windows 8 アプリを開発しています。必要な拡張機能を Filetype フィルターに追加すると、ファイル拡張機能を appxmanifest に追加したにもかかわらず、コードは UnauthorizedAccessException をスローします。
private void OpenFile()
{
try
{
FileOpenPicker pickLog = new FileOpenPicker();
pickLog.CommitButtonText = "Logdatei öffnen";
pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder;
pickLog.ViewMode = PickerViewMode.List;
pickLog.FileTypeFilter.Add(".log"); //This is where the code jumps out
pickLog.FileTypeFilter.Add(".slg");
pickLog.PickSingleFileAsync().Completed += delegate
{
StorageFile logFile = pickLog.PickSingleFileAsync().GetResults();
Stream strLog = logFile.OpenStreamForReadAsync().Result;
vm.LoadCommand.Execute(strLog);
};
pickLog.PickSingleFileAsync();
}
catch (Exception ex) //Catches UnauthorizedAccessException
{
MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString());
md.ShowAsync();
}
}
さらに悪いことに、FileTypeFilter 行をコメント アウトすると、そこに追加した匿名メソッドでコードが飛び出します。
private void OpenFile()
{
try
{
FileOpenPicker pickLog = new FileOpenPicker();
pickLog.CommitButtonText = "Logdatei öffnen";
pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder;
pickLog.ViewMode = PickerViewMode.List;
//pickLog.FileTypeFilter.Add(".log");
//pickLog.FileTypeFilter.Add(".slg");
pickLog.PickSingleFileAsync().Completed += delegate //This is where the code jumps out
{
StorageFile logFile = pickLog.PickSingleFileAsync().GetResults();
Stream strLog = logFile.OpenStreamForReadAsync().Result;
vm.LoadCommand.Execute(strLog);
};
pickLog.PickSingleFileAsync();
}
catch (Exception ex) //Catches COMException
{
MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString());
md.ShowAsync();
}
}
私は何日もかけて徹底的な調査を行いましたが、結果は得られませんでした (StackOverflow を含むソース)。ここで提供された助けに感謝します:)
アップデート :
COMException がスローされた場合、HRESULT は常に (0x80070005) ですが、内側の HRESULT ([詳細] ウィンドウに表示される HRESULT) は通常 -21474xxxx でしたが、権限を昇格した VS でアプリをデバッグすると、内側の HRESULT は -2147024891 です.