1

Unix Executable filesそのため、ディレクトリ内を検索する必要があります。ディレクトリと、検索しているファイルのパスを反復処理します。私が試したいくつかの方法。

1.ファイル拡張子の助けを借りて

Unix Executable fileにはファイル拡張子がありませんが、一部のドキュメント ファイルにも拡張子がありません。だから、それは私にとって失敗しました。

2. NSFileManager の助けを借りて

NSDicitionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];

Unix 実行可能ファイルを見つけるための固有の属性はありません。

3. MDItemRef の助けを借りて

呼び出された属性がありますkMDItemContentTypeが、一部のみに対して正しい結果が得られunix executable filesます。

MDItemRef        inspectedRef;
CFArrayRef       inspectedRefAttributeNames;
CFDictionaryRef  inspectedRefAttributeValues;
inspectedRef = MDItemCreate(kCFAllocatorDefault,(CFStringRef)filePath);
if(inspectedRef) {
    inspectedRefAttributeNames = MDItemCopyAttributeNames(inspectedRef);
    inspectedRefAttributeValues = MDItemCopyAttributes(inspectedRef,inspectedRefAttributeNames);
    NSDictionary *attribDict = (__bridge NSDictionary*)inspectedRefAttributeValues;
    if([[attribDict objectForKey:@"kMDItemContentType"] isEqualToString:@"public.unix-executable"]) 
        NSLog(@"Unix Executable file");
}

4. unix コマンド「file」を使用して

NSTask *unixTask = [[NSTask alloc] init];
[unixTask setStandardOutput:newPipe];
[unixTask setLaunchPath:@"/usr/bin/file"];
[unixTask setArguments:[NSArray arrayWithObject:filePath]]; 
[unixTask launch];
[unixTask waitUntilExit];
[unixTask terminationStatus];

while ((inData = [readHandle availableData]) && [inData length]) {
    returnValue= [[NSString alloc] initWithData:inData encoding:[NSString defaultCStringEncoding]];
    returnValue = [returnValue substringToIndex:[returnValue length]-1];
    NSLog(@"%@",returnValue);
}

ここから、returnValueそれが unix 実行可能かどうかを調べることができます。しかし、それは非常に遅いプロセスです。だから、私の質問は効率的な方法でUNIX実行可能ファイルを検索する方法ですか?

4

2 に答える 2

2

これを思いついたので、URLをベースとして使用するディレクトリにポイントするだけです。これはARCコードです。

配列filesには、見つかった各実行可能ファイルへのURLポインターが含まれています。

@autoreleasepool {

    NSFileManager *defaultFileManager = [NSFileManager defaultManager];
    NSURL *url = [NSURL URLWithString:@"/private/tmp/"]; // Search path
    NSDirectoryEnumerator *dirEnumerator = [defaultFileManager enumeratorAtURL:url includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, nil] options:0 errorHandler:nil];

    NSMutableArray *files = [NSMutableArray array];

    // extract non-executable files
    for (NSURL *file in dirEnumerator) {
        NSNumber *isExecutable;
        NSNumber *isDirectory; // Directories have the executable flag set, but we are not interested in them
        NSError *error, *error2;
        [file getResourceValue:&isExecutable forKey:NSURLIsExecutableKey error:&error];
        [file getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error2];

        // Deal with errors
        if (error)
            NSLog(@"%@", [error localizedDescription]);
        else if (error2)
            NSLog(@"%@", [error2 localizedDescription]);
        else if ([isExecutable boolValue] && ![isDirectory boolValue]) {
            [files addObject:file];
        }

    // print out all executable files to the console
    for (id i in files)
        NSLog(@"%@", [i description]);

}
于 2012-08-10T00:16:44.423 に答える
2

NSURL の getResourceValue:forKey:error: または resourceValuesForKeys:error: メソッドを使用して、NSURLTypeIdentifierKey を要求してみてください。

補遺:

@Aravindhanarvi の言うことが正しい場合、10.6 にはバグがあり、上記の解決策は信頼できません。さらに悪いことに、NSURLIsExecutableKey がないため、@petur ソリューションも使用できません。

別の方法は、NSFileManager にフォールバックし、isExecutableFileAtPath: や attributesOfItemAtPath:error: (具体的には NSFilePosixPermissions および NSFileType 属性) などのメソッドを使用して、@petur によって提案された同じロジックを実装することです。

于 2012-08-09T11:22:11.617 に答える