2009-01-31 16 views
131

के साथ निर्देशिका में फ़ाइलों की एक सूची प्राप्त करना कुछ पागल कारणों से मुझे किसी दिए गए निर्देशिका के लिए किसी ग्लोब के साथ फ़ाइलों की सूची प्राप्त करने का कोई तरीका नहीं मिल रहा है।किसी ग्लोब

मैं वर्तमान की तर्ज पर कुछ के साथ फंस कर रहा हूँ:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSArray *dirContents = [[NSFileManager defaultManager] 
         directoryContentsAtPath:bundleRoot]; 

..और तो सामान मैं नहीं करना चाहता है, जो बेकार बाहर अलग करना। लेकिन मुझे वास्तव में क्या पसंद है, यह पूरी निर्देशिका के लिए पूछने के बजाय "foo * .jpg" जैसी चीज़ों की खोज करने में सक्षम होना है, लेकिन मुझे ऐसा कुछ भी नहीं मिला है।

तो बिल्ली आप कैसे करते हैं?

+0

ब्रायन वेबस्टर जवाब मुझे बाहर एक समान अंक में बहुत मदद की। http://stackoverflow.com/questions/5105250/run-nsbundle-from-the-documents-folder/7179584#7179584 – Wytchkraft

+1

बस इसे पढ़ने वाले किसी को भी ध्यान दें, आप इसे अपनी फाइलों को बस डालकर हल कर सकते हैं फ़ोल्डर http://stackoverflow.com/questions/1762836/create-a-folder-inside-documents-folder-in-ios-apps – seo

उत्तर

3

मैं इस विषय पर एक विशेषज्ञ होने का नाटक नहीं करूंगा, लेकिन आपको glob और wordexp फ़ंक्शन उद्देश्य-सी से नहीं होना चाहिए, नहीं?

5

आपको उन फ़ाइलों को खत्म करने के लिए अपनी खुद की विधि रोल करने की आवश्यकता है, जिन्हें आप नहीं चाहते हैं।

यह अंतर्निहित टूल्स के साथ आसान नहीं है, लेकिन आप RegExKit Lite का उपयोग कर सकते हैं ताकि आपके द्वारा रुचि रखने वाले लौटे सरणी में तत्व ढूंढने में सहायता मिल सके। रिलीज नोट्स के अनुसार यह कोको और कोको-टच दोनों में काम करना चाहिए अनुप्रयोगों।

यहां लगभग 10 मिनट में लिखा गया डेमो कोड है। मैंने < और> को "क्योंकि वे पूर्व ब्लॉक के अंदर दिखाई नहीं दे रहे थे, लेकिन यह अभी भी उद्धरणों के साथ काम करता है। हो सकता है कि कोई भी जो स्टैक ओवरव्लो पर कोड स्वरूपण कोड के बारे में और जानता है, उसे सही करेगा (क्रिस?)

यह एक "फाउंडेशन उपकरण" कमांड लाइन उपयोगिता टेम्पलेट परियोजना है। अगर मैं अपने Git डेमॉन ऊपर और मेरे घर सर्वर पर चल पाने मैं इस परियोजना के लिए URL जोड़ने के लिए इस पोस्ट को संपादित करेंगे।

 
#import "Foundation/Foundation.h" 
#import "RegexKit/RegexKit.h" 

@interface MTFileMatcher : NSObject 
{ 
} 
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath; 
@end 

int main (int argc, const char * argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // insert code here... 
    MTFileMatcher* matcher = [[[MTFileMatcher alloc] init] autorelease]; 
    [matcher getFilesMatchingRegEx:@"^.+\\.[Jj][Pp][Ee]?[Gg]$" forPath:[@"~/Pictures" stringByExpandingTildeInPath]]; 

    [pool drain]; 
    return 0; 
} 

@implementation MTFileMatcher 
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath; 
{ 
    NSArray* filesAtPath = [[[NSFileManager defaultManager] directoryContentsAtPath:inPath] arrayByMatchingObjectsWithRegex:inRegex]; 
    NSEnumerator* itr = [filesAtPath objectEnumerator]; 
    NSString* obj; 
    while (obj = [itr nextObject]) 
    { 
     NSLog(obj); 
    } 
} 
@end 
27

के बारे में क्या एनएसएसटींग के हैसफिक्स और हैप्रफिक्स विधियों का उपयोग करके? कुछ ऐसा (यदि आप "foo * .jpg" खोज रहे हैं):

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot]; 
for (NSString *tString in dirContents) { 
    if ([tString hasPrefix:@"foo"] && [tString hasSuffix:@".jpg"]) { 

     // do stuff 

    } 
} 

सरल, सीधा मैचों के लिए यह एक रेगेक्स लाइब्रेरी का उपयोग करने से आसान होगा।

+0

आपको 'contentOfDirectoryAtPath: त्रुटि:' 'directoryContentsAtPath' के बजाय 'का उपयोग करना चाहिए क्योंकि इसकी' बहिष्कृत ' चूंकि 'आईओएस '2.0 –

+0

प्रश्न का उत्तर देने के लिए सूची में यह पहली प्रतिक्रिया है, इसलिए मैंने इसे – Guy

236

आप NSPredicate की मदद से बहुत आसानी से इस लक्ष्य को हासिल कर सकते हैं, तो जैसे:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSFileManager *fm = [NSFileManager defaultManager]; 
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil]; 
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]; 
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr]; 

आप NSURL साथ यह करने के लिए की जरूरत है बजाय यह इस तरह दिखता है:

NSURL *bundleRoot = [[NSBundle mainBundle] bundleURL]; 
NSArray * dirContents = 
     [fm contentsOfDirectoryAtURL:bundleRoot 
     includingPropertiesForKeys:@[] 
          options:NSDirectoryEnumerationSkipsHiddenFiles 
          error:nil]; 
NSPredicate * fltr = [NSPredicate predicateWithFormat:@"pathExtension='jpg'"]; 
NSArray * onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr]; 
+2

निर्देशिका को वोट दिया सामग्री सामग्री आईओएस 2.0 के बाद से हटा दिया गया है। यह प्रश्न + उत्तर बहुत पुराना है ... – Jonny

+7

बस आगे बढ़ गया और सामग्री का उपयोग करने के लिए कोड नमूना अपडेट किया गयाऑफडायरेक्टरीएटपाथ: त्रुटि: निर्देशिका के बजाय सामग्री सामग्री: –

+0

यह बहुत अच्छा लग रहा है! एक बार में दो फ़ाइल प्रकारों को पकड़ने के लिए भविष्यवाणी को प्रारूपित करने का कोई तरीका है, जैसे '.jpg' और '.png'? – mtmurdock

10

यूनिक्स एक है लाइब्रेरी जो आपके लिए फ़ाइल ग्लोबिंग ऑपरेशन कर सकती है। कार्यों और प्रकारों को glob.h नामक शीर्षलेख में घोषित किया गया है, इसलिए आपको #include की आवश्यकता होगी। यदि टर्मिनल खोलें तो man 3 glob टाइप करके ग्लोब के लिए मैन पेज खोलें तो आपको उन सभी सूचनाएं मिलेंगी जिन्हें आपको कार्यों का उपयोग करने के लिए जानने की आवश्यकता है।

नीचे एक उदाहरण है कि आप एक ग्लोबिंग पैटर्न से मेल खाने वाली फ़ाइलों को सरणी कैसे बना सकते हैं। glob फ़ंक्शन का उपयोग करते समय कुछ चीजें हैं जिन्हें आपको ध्यान में रखने की आवश्यकता है।

  1. डिफ़ॉल्ट रूप से, glob फ़ंक्शन वर्तमान कार्य निर्देशिका में फ़ाइलों को ढूंढता है।किसी अन्य निर्देशिका को खोजने के लिए आपको /bin में सभी फ़ाइलों को प्राप्त करने के लिए मेरे उदाहरण में किए गए ग्लोबबिंग पैटर्न में निर्देशिका नाम को प्रीपेड करना होगा।
  2. जब आप संरचना के साथ किए जाते हैं तो globfree पर कॉल करके glob द्वारा आवंटित स्मृति को साफ़ करने के लिए आप ज़िम्मेदार हैं।

मेरे उदाहरण में मैं डिफ़ॉल्ट विकल्प और कोई त्रुटि कॉलबैक का उपयोग नहीं करता हूं। यदि आप वहां कुछ ऐसा करना चाहते हैं, तो मैन पेज में सभी विकल्पों को शामिल किया गया है। यदि आप उपर्युक्त कोड का उपयोग करने जा रहे हैं, तो मैं इसे NSArray या उस तरह की किसी श्रेणी में जोड़ने के लिए सुझाव दूंगा।

NSMutableArray* files = [NSMutableArray array]; 
glob_t gt; 
char* pattern = "/bin/*"; 
if (glob(pattern, 0, NULL, &gt) == 0) { 
    int i; 
    for (i=0; i<gt.gl_matchc; i++) { 
     [files addObject: [NSString stringWithCString: gt.gl_pathv[i]]]; 
    } 
} 
globfree(&gt); 
return [NSArray arrayWithArray: files]; 

संपादित करें: मुझे लगता है कि एक वर्ग NSArray+Globbing कहा जाता है में ऊपर कोड शामिल GitHub पर एक सार बना लिया है।

+0

'stringWithCString: 'बहिष्कृत है। सही प्रतिस्थापन '- [NSFileManager stringWithFileSystemReresentation: length:] ', हालांकि मुझे लगता है कि ज्यादातर लोग' stringWithUTF8String: 'का उपयोग करते हैं (जो आसान है लेकिन सही एन्कोडिंग होने की गारंटी नहीं है)। संकेत के लिए –

+0

@ पीटर धन्यवाद। –

2

stringWithFileSystemRepresentation आईओएस में उपलब्ध नहीं प्रतीत होता है।

32

यह IOS के लिए काफी अच्छी तरह से काम करता है, लेकिन cocoa के लिए भी काम करना चाहिए।

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
NSFileManager *manager = [NSFileManager defaultManager]; 
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot]; 
NSString *filename; 

while ((filename = [direnum nextObject])) { 

    //change the suffix to what you are looking for 
    if ([filename hasSuffix:@".data"]) { 

     // Do work here 
     NSLog(@"Files in resource folder: %@", filename);    
    }  
} 
12

बहुत सरल विधि:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSFileManager *manager = [NSFileManager defaultManager]; 
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory 
               error:nil]; 
//--- Listing file by name sort 
NSLog(@"\n File list %@",fileList); 

//---- Sorting files by extension  
NSArray *filePathsArray = 
    [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory 
                 error:nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF EndsWith '.png'"]; 
filePathsArray = [filePathsArray filteredArrayUsingPredicate:predicate]; 
NSLog(@"\n\n Sorted files by extension %@",filePathsArray); 
संबंधित मुद्दे