1

如果我在设备上运行此代码,它会返回“得到它”:

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 可执行文件和 radiance 文件。

谁能解释发生了什么?该文件绝对位于正确的位置(捆绑包),因为我已经测试了检查是否存在与我知道也存在的其他文件的代码..

4

3 回答 3

4

设备上的权限与模拟器非常不同(受到更多限制)。由于各种原因,您无法访问很多地方(例如,更改某些文件会破坏应用程序的数字签名,从而使您的应用程序无法再运行)。

此外,如果您的应用程序不遵循 Apple 关于在何处(以及何时)存储数据的指南,您的应用程序将被拒绝(如果您以应用商店为目标)。

Xamarin 有一篇关于如何使用 iOS 文件系统的好文章。

于 2012-09-17T12:37:39.593 回答
4

这可能是区分大小写的问题,模拟器不区分大小写,而设备区分大小写。检查您的文件以查看您是否以正确的大小写访问所有文件(即不仅是目录)。

于 2012-09-17T12:31:26.180 回答
2

我解决了这个问题,我的应用程序的几个部分使用如下代码:

fs = new FileStream(fileName, FileMode.Open);

我需要将每次出现的 FileStream() 更改为以下内容:

fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);

由于我的文件在包中并且不需要使用写入操作,这将文件流限制为仅读取操作并允许正确读取文件。

于 2012-09-19T09:47:30.510 回答