1

ユーザーがフォルダをOSXアプリにドロップできるようにしたいと思います。次に、ディレクトリとそのサブディレクトリ内のすべてのファイルを確認します。これは正常に機能しますが、ディレクトリにエイリアスがある場合は機能しません。エイリアスは正しく解決されますが(Matt Gallagherのおかげで、Appleに恥をかかせます)、列挙子はターゲットディレクトリを列挙することを許可しません(要素を返さず、以下のエラーを返すだけです)。サンプルコードは次のとおりです。

-(void)enumDirAtPath:(NSString*)path  {
    NSString* file_enum = nil;
    NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
    while (file_enum = [enumerator nextObject])
    {
        NSString* file =  [[NSString stringWithFormat:@"%@/%@",path,file_enum] stringByResolvingSymlinksAndAliases];

        BOOL isDirectory = NO;
        [[NSFileManager defaultManager] fileExistsAtPath:file isDirectory: &isDirectory];
        if (!isDirectory) {
            NSLog(@"Adding file: %@",file);
        } else {
            NSLog(@"Found dir: %@",file);
           [self enumDirAtPath: file];
        }
   }
}

同じコードでenumeratorAtURL:includingPropertiesForKeys:options:errorHandler:このエラーが発生します:

エラー:エラードメイン= NSCocoaErrorDomainコード=257「ファイル「Musik」を表示する権限がないため、ファイルを開くことができませんでした。」UserInfo = 0x1094cf670 {NSURL = file:// localhost / Users / david / Desktop / Musik、NSFilePath = / Users / david / Desktop / Musik、NSUnderlyingError =0x1094d43f0"操作を完了できませんでした。操作は許可されていません"}

再帰呼び出しをdispatch_asyncしただけでも、それを実行できません。ディレクトリを繰り返し処理してすべてのコンテンツを取得する方法はありますか?

注:これにより無限ループが発生する可能性があることを十分に認識しています。このコードは、問題を説明するためのものです。

4

1 に答える 1

0

答えはエラーメッセージにあると確信しています。

ファイル「Musik」は、表示する権限がないため開くことができませんでした。

Finderアプリケーションでエイリアスの宛先を明らかにし、「情報を見る」またはls -l@ターミナルでその権限を確認します—ユーザーアカウントdavidに次のいずれかの権限が付与されていないことは間違いありません。

  • read
  • execute
  • list

最後のものは、明示的な-access-control-entryとの組み合わせを除いて、通常はコマンドラインに表示されません。deny

于 2012-05-18T16:42:15.840 に答える