2012-08-09 79 views
1

所以,我需要在目錄中搜索Unix Executable files。我遍歷目錄和我正在搜索的文件的路徑。我試過的一些方法。如何以編程方式在OS X中搜索unix可執行文件?

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可執行文件?

回答

2

嘗試使用NSURL的getResourceValue:forKey:error:或resourceValuesForKeys:error:方法並請求NSURLTypeIdentifierKey。

附錄:

如果什麼@Aravindhanarvi說是正確的,在10.6有錯誤和上面的解決方案是不可靠的。更糟糕的是@petur解決方案也不適用於缺少NSURLIsExecutableKey。

另一種方法是退回到NSFileManager並使用isExecutableFileAtPath:和attributesOfItemAtPath:error:(特別是NSFilePosixPermissions和NSFileType屬性)等方法來實現@petur建議的相同邏輯。

+0

感謝您的回答。對於文檔類型文件也顯示爲Unix可執行文件:( – Aravindhan 2012-08-10 08:32:59

+0

我不知道你以前的評論意味着什麼。你的意思是NSURLTypeIdentifierKey屬性是「public.unix-executable」,但查找器列出文件爲「文件「?這聽起來很奇怪。 – 2012-08-10 09:32:14

+0

雅..我不是爲什麼它顯示文件文件爲unix可執行文件。 – Aravindhan 2012-08-10 09:40:20

2

想到了這一點,只需將url指向您要用作基地的目錄即可。 這是ARC代碼。

數組文件包含指向找到的每個可執行文件的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]); 

} 
+0

NSURLIsExecutableKey僅在10.7中存在。我想在10.6中做到這一點。 – Aravindhan 2012-08-10 08:51:13

+0

下次請在問題主體中註明這樣的限制:) – 2012-08-11 09:30:46

相關問題