গ্লোব সহ ডিরেক্টরিতে একটি ফাইলের তালিকা পাওয়া


136

কিছু পাগল কারণে আমি প্রদত্ত ডিরেক্টরিতে গ্লোব দিয়ে ফাইলগুলির তালিকা পাওয়ার কোনও উপায় খুঁজে পাচ্ছি না।

আমি বর্তমানে এর লাইনে কিছু দিয়ে আটকে আছি:

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

.. এবং তারপরে আমি চাই না এমন জিনিসগুলি বাইরে বের করে ফেলছি যা চোষে। তবে আমি যা চাই তা হ'ল পুরো ডিরেক্টরিটি না জিজ্ঞাসার পরিবর্তে "foo * .jpg" এর মতো কিছু সন্ধান করতে সক্ষম হওয়া, তবে আমি এর মতো কিছু খুঁজে পাইনি।

সুতরাং কিভাবে আপনি এই কাজ করেন?


ব্রায়ান ওয়েবস্টার এর উত্তর আমাকে অনুরূপ ইস্যুতে অনেক সাহায্য করেছিল। stackoverflow.com/questions/5105250/...
Wytchkraft

1
এটি যে কারও কাছে পড়ার জন্য কেবলমাত্র সাইড নোট, আপনি কেবল নিজের ফাইলগুলি একটি ফোল্ডারে স্ট্যাকওভারফ্লো
সেও

উত্তর:


240

আপনি এনএসপ্রেডিকেটের সাহায্যে খুব সহজেই এটি অর্জন করতে পারেন:

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 *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
ডিরেক্টরি কন্টেন্টসএটিপথ আইওএস ২.০ থেকে অবহেলিত। এই প্রশ্ন + উত্তরটি খুব পুরানো ...
জনি

7
ঠিক আগে গিয়েছিল এবং কনটেন্টসঅফডায়টারিএটিপথ ব্যবহারের জন্য কোডের নমুনাটিকে আপডেট করেছে: ত্রুটি: ডাইরেক্টরি কনটেন্টস
ব্রায়ান ওয়েবস্টার

5
হ্যাঁ, আপনি OR স্টেটমেন্টগুলি ব্যবহার করে অতিরিক্ত যুক্তি যুক্ত করতে পারেন, যেমন "স্ব-স্বচ্ছন্দ" .jpg 'বা স্ব-স্বচ্ছন্দ' .png '"
ব্রায়ান ওয়েবস্টার

2
এটি দুর্দান্ত ... আমি এখন পুরো দিন ধরে অন্যান্য পদ্ধতির সাথে ঘুরে বেড়াচ্ছি! গ্রেট। মূল কৌশলটি কেবল স্ট্যাকোতে কী সন্ধান করতে হবে তা জানা!
ক্লিফ রিবাউডো

3
আপনি "ENDSWITH" এর পরিবর্তে "pathExistance == '.xxx'" ব্যবহার করতে পারেন। এই উত্তরটি দেখুন
ব্রুনো বেরিসো

34

এটি বেশ সুন্দরভাবে কাজ করে তবে এটির 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);            
    }       
}

28

এনএসএসটিংয়ের হ্যাশফিক্স এবং হ্যাশপ্রেফিক্স পদ্ধতি ব্যবহার সম্পর্কে কী? এর মতো কিছু (আপনি যদি "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

    }
}

এর মতো সরল, সরল ম্যাচের জন্য এটি একটি রেজেক্স লাইব্রেরি ব্যবহারের চেয়ে সহজ হবে।


আপনার ব্যবহার করা উচিত contentsOfDirectoryAtPath:error: পরিবর্তে আপনার করাdirectoryContentsAtPath কারণ এটি 2.0 deprecatedথেকে আছেiOS
অ্যালেক্স সিও

প্রশ্নের উত্তর দেওয়ার জন্য তালিকায় এটিই প্রথম প্রতিক্রিয়া, তাই আমি এটিকে ভোট দিয়েছি
গাই

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);

10

ইউনিক্সের একটি লাইব্রেরি রয়েছে যা আপনার জন্য ফাইল গ্লোব্বিং অপারেশন সম্পাদন করতে পারে। ফাংশন এবং প্রকারগুলি নামক হিসাবে পরিচিত হয় glob.h, যাতে আপনার এটির দরকার হয় #include। যদি কোনও টার্মিনাল খোলে তবে টাইপ করে গ্লোবের জন্য ম্যান পৃষ্ঠা খুলুন man 3 globআপনি ফাংশনগুলি ব্যবহার করতে আপনার প্রয়োজনীয় সমস্ত তথ্য পাবেন।

নীচে আপনি কীভাবে একটি অ্যারে ফাইলগুলি পপ করতে পারেন যা একটি গ্লোব্বিং প্যাটার্নের সাথে মেলে। globফাংশনটি ব্যবহার করার সময় আপনার মনে রাখা উচিত কয়েকটি জিনিস।

  1. ডিফল্টরূপে, globফাংশনটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলির সন্ধান করে। অন্য ডিরেক্টরিটি অনুসন্ধান করার জন্য আপনাকে ডিরেক্টরিটির নামটি বিশ্বব্যাপী প্যাটার্নে প্রিনড করতে হবে যেমন আমি আমার উদাহরণটিতে করেছি সমস্ত ফাইলগুলিতে প্রবেশ করতে /bin
  2. আপনি কাঠামোর কাজ শেষ করার পরে globকল করে বরাদ্দকৃত স্মৃতি পরিষ্কার করার জন্য আপনি দায়বদ্ধ globfree

আমার উদাহরণে আমি ডিফল্ট বিকল্পগুলি এবং কোনও ত্রুটি কলব্যাক ব্যবহার করি না। আপনি ব্যবহার করতে চান এমন কিছু ক্ষেত্রে ম্যান পেজ সমস্ত অপশনকে কভার করে। আপনি যদি উপরের কোডটি ব্যবহার করতে চলেছেন তবে আমি এটিকে বিভাগ হিসাবে 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];

সম্পাদনা: আমি গিথুবে একটি টুকরো তৈরি করেছি যাতে উপরের কোডটি এনএসএরারি + গ্লোব্বিং নামে একটি বিভাগে রয়েছে ।


stringWithCString:অবচয় করা হয়। সঠিক প্রতিস্থাপনটি হ'ল -[NSFileManager stringWithFileSystemRepresentation:length:]যদিও আমি মনে করি বেশিরভাগ লোকেরা ব্যবহার করেন stringWithUTF8String:(যা সহজ তবে সঠিক এনকোডিং হওয়ার নিশ্চয়তা নেই)।
পিটার হোসি

5

আপনি চান না এমন ফাইলগুলি মুছে ফেলার জন্য আপনার নিজস্ব পদ্ধতি রোল করা উচিত।

অন্তর্নির্মিত সরঞ্জামগুলির সাথে এটি সহজ নয়, তবে আপনি যে আগ্রহী সেই ফিরিয়ে নেওয়া অ্যারের উপাদানগুলি সন্ধানে সহায়তা করার জন্য আপনি RegExKit লাইট ব্যবহার করতে পারেন the রিলিজ নোট অনুসারে এটি কোকো এবং কোকো-টাচ অ্যাপ্লিকেশন উভয় ক্ষেত্রেই কাজ করা উচিত।

এখানে আমি ডেমো কোডটি লিখেছিলাম প্রায় 10 মিনিটের মধ্যে। আমি <এবং> "এ" পরিবর্তন করেছিলাম কারণ তারা পূর্ব ব্লকের ভিতরে প্রদর্শিত হচ্ছে না, তবে এটি এখনও উদ্ধৃতিগুলির সাথে কাজ করে Maybe সম্ভবত স্ট্যাক ওভারফ্লোতে কোড ফর্ম্যাটিং সম্পর্কে আরও কিছু জানেন এমন কেউ এই (ক্রিস?) সংশোধন করবে।

এটি একটি "ফাউন্ডেশন সরঞ্জাম" কমান্ড লাইন ইউটিলিটি টেম্পলেট প্রকল্প। যদি আমি আমার গিট ডেমনটি আপ করি এবং আমার হোম সার্ভারে চলি তবে আমি এই পোস্টটি সম্পাদনা করব প্রকল্পের URL টি যুক্ত করতে।

# গুরুত্বপূর্ণ "ফাউন্ডেশন / ফাউন্ডেশন। h"
# ইম্পোর্ট "রেজেক্সকিট / রেজেক্সকিট এইচ"

@ ইনটারফেস এমটিফাইলম্যাচার: এনএসবজেক্ট 
{
}
- (অকার্যকর) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath;
@শেষ

ইন্ট মেইন (ইন্ট আরজিসি, কনস্ট চর * আরগভি [])
{
    এনএসআউটোরলিজপুল * পুল = [[এনএসএটোরলেজপুল বরাদ্দ] init];

    // এখানে কোড sertোকান ...
    এমটিফাইলম্যাচার * ম্যাচার = [[[এমটিফাইলম্যাচার বরাদ্দ] init] অটোরিলেজ];
    [ম্যাচার্স ফাইলেস ম্যাচিংরেগেক্স: @ "^। + \\। [জেজে] [পিপি] [Ee]? [জিজি] $" ফর্মথ: [@ "~ / ছবি" স্ট্রিংবাইএক্সপ্যান্ডিংটিলডিআইপথ]];

    [পুল ড্রেন];
    প্রত্যাবর্তন 0;
}

@ বাস্তবায়ন এমটিফাইলম্যাচার
- (অকার্যকর) getFilesMatchingRegEx: (NSString *) inRegex forPath: (NSString *) inPath;
{
    এনএসআরাই * ফাইলসটপাথ = [[[এনএসফিলম্যানেজার ডিফল্ট ম্যানেজার] ডিরেক্টরিকন্টেন্টস এটপাথ: ইনপ্যাথ] অ্যারেবাই ম্যাচিংঅবজেক্টস উইথরেজেক্স: ইনরেজেক্স];
    এনএসইউনমেন্টার * এটিআর = [ফাইলসটপথ অবজেক্টমেনামেটর];
    এনএসএসটিং * আপত্তি;
    যখন (আপত্তি = [এটি পরের বিষয়])
    {
        NSLog (obj);
    }
}
@শেষ

3

আমি এই বিষয়ে বিশেষজ্ঞ হওয়ার ভান করব না, তবে আপনার উদ্দেশ্য-সি থেকে কোনও globএবং উভয় ক্ষেত্রেই অ্যাক্সেস থাকা উচিত wordexp, না?


2

স্ট্রিংউইথফাইসিসিটারমিপ্রেসিভেশন আইওএস-এ উপলব্ধ বলে মনে হয় না।


0

সুইফট 5

এটি কোকো জন্য কাজ করে

        let bundleRoot = Bundle.main.bundlePath
        let manager = FileManager.default
        let dirEnum = manager.enumerator(atPath: bundleRoot)


        while let filename = dirEnum?.nextObject() as? String {
            if filename.hasSuffix(".data"){
                print("Files in resource folder: \(filename)")
            }
        }

0

কোকো জন্য সুইফট 5

        // Getting the Contents of a Directory in a Single Batch Operation

        let bundleRoot = Bundle.main.bundlePath
        let url = URL(string: bundleRoot)
        let properties: [URLResourceKey] = [ URLResourceKey.localizedNameKey, URLResourceKey.creationDateKey, URLResourceKey.localizedTypeDescriptionKey]
        if let src = url{
            do {
                let paths = try FileManager.default.contentsOfDirectory(at: src, includingPropertiesForKeys: properties, options: [])

                for p in paths {
                     if p.hasSuffix(".data"){
                           print("File Path is: \(p)")
                     }
                }

            } catch  {  }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.