11

を使用してサンドボックスの Application Support ディレクトリをフェッチNSFileManager:URLForDirectoryすると、次の URL が返されます。

file://localhost/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/

ただしNSFileManager:enumeratorAtURL、ディレクトリを検索するために使用すると、次の形式の URL が返されます。

file://localhost/private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/

URL の検索/置換操作を行っており、その違いによって不一致が発生するため、これが問題を引き起こしています。以前にこの種の違いに遭遇したことがあり、私の解決策はNSURL:path、生の URL の代わりに URL のパスを使用することでしたが (を使用)、生成されたパスは次のとおりです。

/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support
/private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support/

私がやろうとしているのはこれです: Application Support ディレクトリに同じ名前で異なる場所のファイルをいくつでも持つことができ、Application Support ディレクトリからの相対パスを抽出する必要があります。つまり、次の場合

/Application Support/abc/file.dat
/ApplicationSupport/abc/def/file.dat

「abc」と「abc/def」を抽出できるようにしたい。次のコードを使用してこれを行っていました。

NSArray *keys = [NSArray arrayWithObject:NSURLIsRegularFileKey];
NSDirectoryEnumerator *dirEnumerator = [self.fileManager enumeratorAtURL:[MyManager appSupportDirectory]
                                          includingPropertiesForKeys:keys
                                                             options:NSDirectoryEnumerationSkipsHiddenFiles
                                                        errorHandler:nil];
    for (NSURL *url in dirEnumerator)
    {
        if ( NSOrderedSame == [[url lastPathComponent] caseInsensitiveCompare:kFilename])
        {
            NSString *appSupportPath = [[MyManager appSupportDirectory] path];
            NSString *pathToFile = [url path];
            pathToFile = [pathToFile URLByDeletingLastPathComponent];
            NSString *subPath = [pathToFile  stringByReplacingOccurrencesOfString:appSupportPath withString:@""];

(MyManager:appSupportDirectory は NSFileManager:URLForDirectory を呼び出します: NSApplicationSupportDirectory を使用して)

enumeratorAtURL:これは、同じパスを返すシミュレータでは正常に機能しURLFOrDirectory:ますが、ハードウェアの違いにより失敗します。

同一のパスを取得enumeratorAtURL:URLForDirectory:て返す方法はありますか、そうでない場合は、現在行っているサブパスを抽出する別のエレガントな方法がありますか?

4

2 に答える 2

7

varにシンボリックリンクされています/private/var/

呼び出すと[url URLByResolvingSymlinksInPath]修正されます。

「 iOS ファイル パスの /private プレフィックスは何を示していますか?」を参照してください。詳細については。

于 2013-04-16T00:11:05.530 に答える
3

代わりにこれを行うことに切り替える必要がありました:

NSDirectoryEnumerator *dirEnum = [self.fileManager enumeratorAtPath: [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]];
于 2012-07-18T19:07:45.577 に答える