0

我正在尝试 MonoTouch/MonoAndroid,一切都很顺利,直到我调用了 IsolatedStorageFile.GetFileNames(string) 函数。参数是“Foo/Foo1/*”。结果是没有消息的 SecurityException。

目录“Foo/Foo1”存在,因为它刚刚被使用 IsolatedStorageFile.GetDirectoryNames() 调用找到。

我在引发异常的 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 ();
}

我无法使用调试器进入它,所以我不知道为什么条件为假。这在 iOS 和 Android 上都会发生。很久以前在 http://www.digipedia.pl/usenet/thread/12492/1724/#post1724上记录了一个类似的问题,但没有回复。

相同的代码在 Windows Phone 7 上运行没有问题(使用 \ 作为路径分隔符)。

有没有人知道可能是什么原因造成的?目录名称中的大写字母有问题吗?

4

1 回答 1

1

这是 Mono 中的一个错误。隔离存储不适用于连续包含多个目录的路径(例如 Foo/Foo1/*)

我将 GetFileNames() 方法的代码从 Mono 复制到我的项目中,以便我可以调试它。我发现问题出在此条件的第二个术语中(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 回答