如果我在设备上运行此代码,则返回“get it”:
if (Directory.Exists (NSBundle.MainBundle.BundlePath + "/ARCSDev")) {
Console.WriteLine ("got it");
} else {
Console.WriteLine ("can't find it");
}
这意味着该目录位于主包中。
我需要在此方法调用中使用该文件:
private void generateChart (int chartNumber, string palette)
{
string filePath = NSBundle.MainBundle.BundlePath + "/ARCSDev";
Console.WriteLine("Filepath - " + filePath);
Loader loader = new Loader (filePath);
loader.LoadChart (Convert.ToString (chartNumber));
上面的代码在模拟器上运行正常,但在设备上没有。
当设备发生错误时,我得到以下堆栈跟踪:
System.InvalidOperationException: Operation is not valid due to the current state of the object
at System.Linq.Enumerable.Max[TileIndexRecord] (IEnumerable`1 source, System.Func`2 selector) [0x00000] in <filename unknown>:0
at MyCompany.Data.Arcs.Loader.ExtractWriteableBitmap (MyCompany.Data.Arcs.Records.RGBPaletteRecord rgbPalette, Double dpi, MyCompany.Data.Arcs.Raschts.ChartIndexFile indexFile, MyCompany.Data.Arcs.Raschts.RasterChartFile chartFile) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Loader.cs:571
at MyCompany.Data.Arcs.Loader.GetHiResImage (MyCompany.Data.Arcs.Records.RGBPaletteRecord rgbPalette) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Loader.cs:362
at ARCSViewer.SecondViewController.generateChart (Int32 chartNumber, System.String palette) [0x0004e] in /Users/me/Desktop/ARCSViewer/ARCSViewer/SecondViewController.cs:118
at ARCSViewer.SecondViewController.ViewDidAppear (Boolean animated) [0x00007] in /Users/me/Desktop/ARCSViewer/ARCSViewer/SecondViewController.cs:84
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
at ARCSViewer.Application.Main (System.String[] args) [0x00000] in /Users/me/Desktop/ARCSViewer/ARCSViewer/Main.cs:17
该目录包含unix可执行文件和辐射文件。
任何人都可以解释发生了什么事吗?该文件肯定是在正确的位置(捆绑),因为我已经测试了检查存在的代码以及我知道的其他文件..
答案 0 :(得分:4)
这可能是区分大小写的问题,模拟器不区分大小写,而设备区分大小写。检查您的文件,看看您是否使用正确的案例(即不仅仅是目录)访问了所有文件。
答案 1 :(得分:4)
设备上的权限与模拟器的权限非常不同(更受限制)。由于各种原因,您有很多地方没有访问权限(例如,更改某些文件会破坏应用程序数字签名,这将导致您的应用程序无法再运行)。
此外,如果您的应用程序未遵循Apple关于存储数据的位置(以及何时)的指导,您的应用程序将被拒绝(如果您定位到appstore)。
Xamarin对于如何使用iOS文件系统有一个很好的article。
答案 2 :(得分:2)
我解决了这个问题,我的应用程序的几个部分使用如下代码:
fs = new FileStream(fileName, FileMode.Open);
我需要将每次出现的FileStream()更改为以下内容:
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
由于我的文件在捆绑包中而不需要使用写入操作,因此这会将文件流限制为仅读取操作并允许正确读取文件。