source

전역이 있는 디렉토리의 파일 목록 가져오기

manycodes 2023. 5. 1. 21:34
반응형

전역이 있는 디렉토리의 파일 목록 가져오기

미친 이유로 지정된 디렉터리에 대해 전역이 있는 파일 목록을 가져올 수 없습니다.

저는 현재 다음과 같은 문제에 봉착해 있습니다.

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

내가 원하지 않는 것들을 벗겨내다니, 정말 안됐군요.하지만 제가 정말 원하는 것은 전체 디렉터리를 묻는 대신 "foo*.jpg"와 같은 것을 검색할 수 있는 것입니다. 하지만 저는 그런 것을 찾을 수 없었습니다.

그럼 어떻게 하는 겁니까?

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

이것은 에 꽤 잘 작동합니다.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);            
    }       
}

NSString의 hasSufix와 hasprefix 메서드를 사용하는 것은 어떻습니까?("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

    }
}

이러한 단순하고 간단한 일치의 경우 정규식 라이브러리를 사용하는 것보다 더 간단합니다.

가장 간단한 방법:

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

유닉스에는 파일 글로빙 작업을 수행할 수 있는 라이브러리가 있습니다.은 함와유다같음헤선은다언니됩라는 됩니다.glob.h그래서 당신은 할 필요가 있을 것입니다.#include man 를 미널을열글맨페엽니다를이지로터를 입력하여 엽니다.man 3 glob기능을 사용하는 데 필요한 모든 정보를 얻을 수 있습니다.

다음은 글로빙 패턴과 일치하는 파일을 배열에 채우는 방법의 예입니다.glob기능 당신이 명심해야 할 몇 가지가 있습니다.

  1. 적으로기본,,globfunction은 현재 작업 디렉터리에서 파일을 찾습니다.예에서 렉 터 리 는 디 이 패 글 추 야 합 해 가 니 다 에 턴 빙 로 을 름 터 렉 럼 것 처 오 검 를 을/bin.
  2. ▁by▁▁memory▁you에 의해 할당된 메모리를 이 있습니다.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];

편집 : NSArray+Globbing이라는 카테고리에 위의 코드가 포함된 giston github을 만들었습니다.

원하지 않는 파일을 제거하려면 자신만의 방법을 롤해야 합니다.

내장된 도구로는 이 작업이 쉽지 않지만 ReGExKitLite를 사용하여 반환된 배열에서 원하는 요소를 찾는 데 도움이 될 수 있습니다.릴리스 정보에 따르면 이 기능은 코코아 및 코코아-터치 응용 프로그램 모두에서 작동합니다.

여기 제가 약 10분 만에 작성한 데모 코드가 있습니다.< 및 >를 "로 변경했는데, 그 이유는 그들이 사전 블록 안에 나타나지 않았기 때문입니다. 하지만 여전히 인용문과 함께 작동합니다.아마도 StackOverflow에서 코드 포맷에 대해 더 잘 아는 누군가가 이것을 수정할 것입니다(크리스?).

이것은 "기초 도구" 명령줄 유틸리티 템플릿 프로젝트입니다.홈 서버에서 Git 데몬을 설치하고 실행하면 이 게시물을 편집하여 프로젝트의 URL을 추가할 것입니다.

#import "파운데이션/파운데이션.h"#import "RegexKit/RegexKit.h"
@인터페이스 MTFileMatcher : NSObject{}(void) Regex에서 경로:(NSString*)에 대해 FileMatchingRegEx:(NSString*)를 가져옵니다.@끝
intain(argc 내, const char * argv[]){NSAutore release Pool * pool = in [NSAutore release Pool alloc];

여기에 코드 삽입...
MTFileMatcher* matcher = [[[MTFileMatcher alloc] init] 자동 릴리스];
[matcher getFilesMatchingRegEx:@"^.+\\.[Jj][pp][Ee]?[Gg]$" for Path:[@"~/Pictures" string확장 TildeInPath]];

[풀 배수구];
반환 0;}
@구현 MtFileMatcher(void) Regex에서 경로:(NSString*)에 대해 FileMatchingRegEx:(NSString*)를 가져옵니다.{NSrray* filesAtPath = [[NSFileManager defaultManager] 디렉터리ContentsAtPath:inPath] 배열ByMatchingObjectsWithRegex:inRegex];
NSEumerator*itr = [filesAtPath objectEnumerator];
NSString* obj;while (obj = [itr nextObject])
{NSLog(obj);
}}@끝

저는 그 주제에 대해 전문가인 척하지는 않겠지만, 당신은 두 가지 모두에 접근할 수 있어야 합니다.glob그리고.wordexp목적-c로부터의 함수, 아닌가요?

stringWithFileSystemRepresentation은 iOS에서 사용할 수 없는 것 같습니다.

스위프트 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)")
            }
        }

코코아를 위한 스위프트 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  {  }
        }

언급URL : https://stackoverflow.com/questions/499673/getting-a-list-of-files-in-a-directory-with-a-glob

반응형