전역이 있는 디렉토리의 파일 목록 가져오기
미친 이유로 지정된 디렉터리에 대해 전역이 있는 파일 목록을 가져올 수 없습니다.
저는 현재 다음과 같은 문제에 봉착해 있습니다.
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
기능 당신이 명심해야 할 몇 가지가 있습니다.
- 적으로기본,,
glob
function은 현재 작업 디렉터리에서 파일을 찾습니다.예에서 렉 터 리 는 디 이 패 글 추 야 합 해 가 니 다 에 턴 빙 로 을 름 터 렉 럼 것 처 오 검 를 을/bin
. - ▁by▁▁memory▁you에 의해 할당된 메모리를 이 있습니다.
glob
화로로globfree
구조물을 다 만들면 됩니다.
이 예에서는 기본 옵션을 사용하고 오류 콜백은 사용하지 않습니다.메뉴 페이지에는 사용할 내용이 있을 경우를 대비하여 모든 옵션이 포함되어 있습니다.코드를을 추천합니다.NSArray
아니면 그런 비슷한 것.
NSMutableArray* files = [NSMutableArray array];
glob_t gt;
char* pattern = "/bin/*";
if (glob(pattern, 0, NULL, >) == 0) {
int i;
for (i=0; i<gt.gl_matchc; i++) {
[files addObject: [NSString stringWithCString: gt.gl_pathv[i]]];
}
}
globfree(>);
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
'source' 카테고리의 다른 글
PowerShell을 사용하여 바로 가기를 만드는 방법 (0) | 2023.05.01 |
---|---|
Excel 셀에서 선행 0의 자동 자르기를 방지하는 방법 (0) | 2023.05.01 |
Excel vba 새로 고침 대기 (0) | 2023.05.01 |
자동 크기 조정 기능을 유지하여 WPF에서 텍스트를 회전하는 방법 (0) | 2023.05.01 |
깃 상위 포인터를 다른 상위 포인터로 설정 (0) | 2023.05.01 |