4

I need to copy a few sample files from my app's resource folder and place them in my app's document folder. I came up with the attached code, it compiles fine but it doesn't work. All the directories I refer to do exist. I'm not quite sure what I am doing wrong, could someone point me in the right direction please?

NSFileManager*manager = [NSFileManager defaultManager];

NSString*dirToCopyTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

NSString*path = [[NSBundle mainBundle] resourcePath];

NSString*dirToCopyFrom = [path stringByAppendingPathComponent:@"Samples"];


NSError*error;

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

for (NSString *file in files)
{
        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

        if (error)
        {
            NSLog(@"%@",[error localizedDescription]);
    }
}

EDIT: I just edited the code the way it should be. Now however there's another problem:

2010-05-15 13:31:31.787 WriteIt Mobile[4587:207] DAMutableDictionary.h 2010-05-15 13:31:31.795 WriteIt Mobile[4587:207] FileManager Error:Operation could not be completed. File exists

EDIT : I have fixed the issue by telling NSFileManager the names of the copied files's destinations.

        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:[dirToCopyTo stringByAppendingPathComponent:file] error:&error];
4

4 に答える 4

5

問題は次の行にあると思います。

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyTo error:nil];

ソースではなく宛先ディレクトリにファイルをリストしています。次のように変更します。

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

そして、あなたは大丈夫なはずです。

于 2010-05-15T11:43:19.650 に答える
2

問題は、dirToCopyTo からコピーするファイルを読み取っていることであり、dirToCopyFrom を意味していると思います

また、ドキュメント ディレクトリを取得するには、 NSDocumentDirectoryを使用する必要があります- (NSArray *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask

于 2010-05-15T11:44:15.157 に答える
2

起動時の時間のかかる操作は避ける必要があることに注意してください。

  1. ユーザー エクスペリエンスが良くない (遅延と途切れ途切れの動作)
  2. iOS の Watchdog は、アプリがスタックしたかのように強制終了する可能性があります。

したがって、セカンダリスレッド(または操作...または別の実行パスを使用するもの)でコピーを実行します。

UI に入力するデータが必要な場合は、別の問題が発生します。その場合:

  • UI 要素を無効にする
  • 非同期/スレッド操作を開始する
  • コピーの完了コールバックで (通知、プロトコルなどを介して)、データのフェッチを開始できることを UI インターフェイスに通知します。

たとえば、ZIP ファイルをコピーして解凍しますが、時間がかかるため、終了時に UI をトリガーするタイマー プロシージャに配置する必要がありました。

例が必要な場合は、私に知らせてください。

PS:
ZIP ファイルを使用したコピーは、次のように効率的です。

  1. ファイルシステムへの呼び出しのみ
  2. コピーするバイト数がはるかに少ない

悪いニュース: ルーチンを使用して zip ファイルを解凍する必要がありますが、それらは Web で見つけることができます。

Zip ファイルの解凍は、これらの呼び出しがすべてのオーバーヘッドを伴う Cocoa ではなくストレート C で記述されているため、より効率的です。

于 2011-09-04T07:28:49.827 に答える
1
    [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

宛先パスは、ファイル名を含む、コピーに必要なパスです。NSFileManager がソース ファイルの名前を埋めることを期待して、ディレクトリへのパスを渡すことはできません。これはしません。

ドキュメントには、宛先パスに存在するものを記述してはならないことが記載されています。

…操作前に dstPath が存在してはなりません。

あなたの場合、それは宛先ディレクトリへのパスであるため、存在するため、コピーが失敗します。

目的のファイル名を追加して、宛先ファイルへのパスにする必要があります。その後、存在しないため (以前にコピーされていない場合)、コピーは成功します。

于 2010-05-15T19:53:47.320 に答える