0

私は MonoTouch/MonoAndroid を試していましたが、IsolatedStorageFile.GetFileNames(string) 関数を呼び出すまではすべてうまくいっていました。パラメータは「Foo/Foo1/*」でした。結果は、メッセージのない SecurityException です。

IsolatedStorageFile.GetDirectoryNames() 呼び出しを使用して見つかったばかりのディレクトリ「Foo/Foo1」が存在します。

Mono ソースで例外をスローするこのビットを特定しました (IsolatedStorageFile.cs 内):

DirectoryInfo[] subdirs = directory.GetDirectories (path);
// we're looking for a single result, identical to path (no pattern here)
// we're also looking for something under the current path (not
outside isolated storage)
if ((subdirs.Length == 1) && (subdirs [0].Name == path) && (subdirs[0].FullName.IndexOf(directory.FullName) >= 0)) {
  afi = subdirs [0].GetFiles (pattern);
} else {
  // CAS, even in FullTrust, normally enforce IsolatedStorage
  throw new SecurityException ();
}

デバッガーでステップインできないため、条件が false である理由がわかりません。これは、iOS と Android の両方で発生します。ずっと前に http://www.digipedia.pl/usenet/thread/12492/1724/#post1724に記録された同様の問題がありましたが、返信はありません。

同じコードが Windows Phone 7 でも問題なく動作します (パスの区切り記号として \ を使用)。

誰かがそれを引き起こしている可能性のあるアイデアを持っていますか? ディレクトリ名の大文字は問題ですか?

4

1 に答える 1

1

これはMonoのバグです。IsolatedStorageは、1行に複数のディレクトリを含むパス(Foo / Foo1 / *など)では機能しません。

GetFileNames()メソッドのコードをMonoからプロジェクトにコピーして、デバッグできるようにしました。問題はこの状態の第2項にあることがわかりました(IsolatedStorageFile.cs:846):

if ((subdirs.Length == 1) && (subdirs [0].Name == path) &&(subdirs[0].FullName.IndexOf(directory.FullName) >= 0)) {
  afi = subdirs [0].GetFiles (pattern);
} else {
  // CAS, even in FullTrust, normally enforce IsolatedStorage
  throw new SecurityException ();
}

たとえば、GetFileNames()に渡されるパスが「Foo / Bar / *」の場合、subdirs[0].Nameは「Bar」になりますがパスは「Foo/Bar」になり、条件が失敗して例外が発生します。

于 2012-06-27T17:41:51.827 に答える