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命令“文件”

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

尝试使用 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 回答
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 回答