1

WinRT アプリで mp3 ファイルにアクセスする際の問題。

「System.UnauthorizedAccessException」は、アプリが FileOpenPicker によって返されたファイルと同じフォルダー内の名前で mp3 ファイルを開こうとすると発生します。別の言い方をすれば、ユーザーは mp3 ファイルと同じ名前のドキュメント内の情報ファイルを選択します。アプリは情報ファイルを正常に開きますが、mp3 ファイルを開くことができません。

例: ファイル (file1.info) と (file1.mp3) のペアがあります。ファイルピッカーを使用すると、(*.info) ファイルを選択できます。

ユーザーは (file1.info) を選択します。その後、アプリは (file1.info) と (file1.mp3) の両方を開きます。どちらのファイルも DocumentsLibrary フォルダーにありますが、MusicLibrary にはありません。問題は、(file1.mp3) を開こうとすると、「UnauthorizedAccessException」が発生することです。

問題を事前に解決するには:

ファイル: mp3 ファイルをドキュメントにコピーします。mp3 ファイルと同じベース名でテキスト ファイルを作成し、その拡張子を .info に変更します。

Package.appxmanifest > Declarations で、'File Type Associations' 宣言を追加します。「Open is safe」にチェックを入れます。追加

サポートされているファイル タイプ「.mp3」および「.info」。「コンテンツ タイプ」は空のま​​まにします。

コード:

Dim file as StorageFile
Dim fileopenpicker As FileOpenPicker
Dim infofile As StorageFile
Dim mp3file As StorageFile 
Dim filename As String
fileopenpicker = New FileOpenPicker()
fileopenpicker.FileTypeFilter.Add(".info")
fileopenpicker.FileTypeFilter.Add(".mp3")
fileopenpicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary
file = Await fileopenpicker.PickSingleFileAsync()
If file.Path.EndsWith(".info") Then
    infofile = file
    filename = file.Path.Substring(0, file.Path.Length - 4) & "mp3"
    ' This command fails with 'System.UnauthorizedAccessException'
    mp3file = Await StorageFile.GetFileFromPathAsync(filename)
Else 'file is an mp3 file
    mp3file = file
    filename = file.Path.Substring(0, file.Path.Length - 3) & "info"
    ' This command succeeds!
    infofile = Await StorageFile.GetFileFromPathAsync(filename)
End If

そのため、ファイルが fileopenpicker によって実際に選択されていない場合、mp3 ファイルを開く際に特定の問題があるようです。

4

1 に答える 1

2

この問題は、Documents Library 機能とファイルタイプ .mp3 および .info が宣言されているアプリで確認しました。非常に奇妙なバグのように思われることがわかりました。FileOpenPicker を開いた後に大文字のドライブ文字を使用してドキュメント ライブラリ フォルダーへのパスを渡すと、UnauthorizedAccessException が発生します。小文字のドライブ文字を含むパスを使用すると機能します。奇妙なことに、FileOpenPicker を開く前に大文字のドライブ文字を使用できます。

したがって、回避策はパスを小文字にすることです。

私が使用したコードは次のとおりです(C#):

// Trying to get some files from the documents library
// Note: F:\Program Data is my primary documents library folder
string mp3FilePath = @"F:\Program Data\2Mann1Maus.mp3";

// This works even if the drive letter is uppercase
StorageFile file1 = await StorageFile.GetFileFromPathAsync(mp3FilePath);

// It also works with a lowercase drive letter
string infoFilePath = @"f:\Program Data\2Mann1Maus.info";
StorageFile file2 = await StorageFile.GetFileFromPathAsync(infoFilePath);

FileOpenPicker fileopenpicker = new FileOpenPicker();
fileopenpicker.FileTypeFilter.Add(".info");
fileopenpicker.FileTypeFilter.Add(".mp3");
fileopenpicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
StorageFile file = await fileopenpicker.PickSingleFileAsync();
if (file.Path.EndsWith(".info"))
{
   string filename = file.Path.Substring(0, file.Path.Length - 4) + "mp3";   

   // This works
   string testFileName1 = filename.Substring(0, 1).ToLower() + 
      filename.Substring(1,  filename.Length - 1);
   StorageFile mp3file1 = await StorageFile.GetFileFromPathAsync(testFileName1);

   // This works as well
   string testFileName2 = filename.ToLower();
   StorageFile mp3file2 = await StorageFile.GetFileFromPathAsync(testFileName2); 

   // This does cause an UnauthorizedAccessException
   StorageFile mp3file3 = await StorageFile.GetFileFromPathAsync(filename);
}
else
{
   StorageFile mp3file = file;
   String filename = file.Path.Substring(0, file.Path.Length - 3) + "info"; 

   // This works
   string testFileName1 = filename.Substring(0, 1).ToLower() + 
      filename.Substring(1, filename.Length - 1);
   StorageFile infoFile1 = await StorageFile.GetFileFromPathAsync(testFileName1); 

   // This works as well
   string testFileName2 = filename.ToLower();
   StorageFile infoFile2 = await StorageFile.GetFileFromPathAsync(testFileName2); 

   // This does cause an UnauthorizedAccessException
   StorageFile infoFile3 = await StorageFile.GetFileFromPathAsync(filename);
}
于 2012-10-22T08:05:35.180 に答える