1

このコードをデバイスで実行すると、「gotit」が返されます。

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

大文字と小文字の区別の問題である可能性があります。シミュレータでは大文字と小文字が区別されませんが、デバイスでは大文字と小文字が区別されます。ファイルをチェックして、適切なケース(つまり、ディレクトリだけでなく)ですべてのファイルにアクセスしているかどうかを確認します。

于 2012-09-17T12:31:26.180 に答える
4

デバイスの権限は、シミュレーターとは大きく異なります(はるかに制限されています)。さまざまな理由でアクセスできない場所がたくさんあります(たとえば、一部のファイルを変更すると、アプリケーションのデジタル署名が破損し、アプリケーションの実行ができなくなります)。

また、アプリケーションがデータを保存する場所(および時期)に関するAppleのガイドラインに準拠していない場合、アプリケーションは拒否されます(アプリストアをターゲットにしている場合)。

Xamarinから、iOSファイルシステムの操作方法に関するすばらしい記事があります。

于 2012-09-17T12:37:39.593 に答える
2

私は問題を解決しました。私のアプリケーションのいくつかの部分は以下のようなコードを使用しています。

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

FileStream()のすべての出現を次のように変更する必要がありました。

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

私のファイルはバンドルに含まれており、書き込み操作を使用する必要がないため、これによりファイルストリームが読み取り操作のみに制限され、ファイルを正しく読み込むことができます。

于 2012-09-19T09:47:30.510 に答える