IsolatedStorage.GetFileNames在MonoTouch / MonoDroid上失败

时间:2012-06-27 13:27:20

标签: c#-4.0 mono xamarin.ios xamarin.android isolatedstorage

我正在尝试使用MonoTouch / MonoAndroid,一切都在进行中 直到我调用IsolatedStorageFile.GetFileNames(字符串)函数。该 参数是“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上正常运行(使用\用于路径分隔符)。

有没有人有任何想法可能导致它?它是大写的吗? 目录名称有问题吗?

1 个答案:

答案 0 :(得分:1)

这是Mono中的一个错误。 IsolatedStorage不能用于连续包含多个目录的路径(例如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”,条件将失败导致异常。