macos 迭代具有嵌套文件夹的文件夹中的文件 - Cocoa
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5749488/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Iterating through files in a folder with nested folders - Cocoa
提问by minimalpop
I need to access every file in a folder, including file that exist within nested folders. An example folder might look like this.
我需要访问文件夹中的每个文件,包括嵌套文件夹中存在的文件。示例文件夹可能如下所示。
animals/
-k.txt
-d.jpg
cat/
-r.txt
-z.jpg
tiger/
-a.jpg
-p.pdf
dog/
-n.txt
-f.jpg
-p.pdf
Say that I wanted to run a process on every file within "animals" that isn't folder. What would be the best way to iterate through the folder "animals" and all of its subfolders to access every file?
假设我想对不是文件夹的“动物”中的每个文件运行一个进程。遍历文件夹“animals”及其所有子文件夹以访问每个文件的最佳方法是什么?
Thanks.
谢谢。
回答by
Use NSDirectoryEnumerator
to recursively enumerate files and directories under the directory you want, and ask it to tell you whether it is a file or directory. The following is based on the example listed at the documentation for -[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:]
:
使用NSDirectoryEnumerator
递归枚举文件和目录,你想要的,并要求它要告诉你它是否是一个文件或目录的目录下。以下内容基于以下文档中列出的示例-[NSFileManager enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:]
:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *directoryURL = … // URL pointing to the directory you want to browse
NSArray *keys = [NSArray arrayWithObject:NSURLIsDirectoryKey];
NSDirectoryEnumerator *enumerator = [fileManager
enumeratorAtURL:directoryURL
includingPropertiesForKeys:keys
options:0
errorHandler:^BOOL(NSURL *url, NSError *error) {
// Handle the error.
// Return YES if the enumeration should continue after the error.
return YES;
}];
for (NSURL *url in enumerator) {
NSError *error;
NSNumber *isDirectory = nil;
if (! [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:&error]) {
// handle error
}
else if (! [isDirectory boolValue]) {
// No error and it's not a directory; do something with the file
}
}
回答by Karl von Moor
Maybe you can use something like this:
也许你可以使用这样的东西:
+(void)openEachFileAt:(NSString*)path
{
NSDirectoryEnumerator* enumerator = [[NSFileManager defaultManager] enumeratorAtPath:path];
for (NSString * file in enumerator)
{
// check if it's a directory
BOOL isDirectory = NO;
NSString* fullPath = [path stringByAppendingPathComponent:file];
[[NSFileManager defaultManager] fileExistsAtPath:fullPath
isDirectory: &isDirectory];
if (!isDirectory)
{
// open your file (fullPath)…
}
else
{
[self openEachFileAt: fullPath];
}
}
}
回答by Esqarrouth
Here is a swift version:
这是一个快速版本:
func openEachFile(inDirectory path: String) {
let subs = try! FileManager.default.subpathsOfDirectory(atPath: path)
let totalFiles = subs.count
print(totalFiles)
for sub in subs {
if sub.hasSuffix(".DS_Store") {
//a DS_Store file
}
else if sub.hasSuffix(".xcassets") {
//a xcassets file
}
else if (sub as NSString).substring(to: 4) == ".git" {
//a git file
}
else if sub.hasSuffix(".swift") {
//a swift file
}
else if sub.hasSuffix(".m") {
//a objc file
}
else if sub.hasSuffix(".h") {
//a header file
}
else {
// some other file
}
let fullPath = (path as NSString).appendingPathComponent(sub)
}
}
回答by mz2
Here's a solution using -subpathsOfDirectoryAtPath:rootPath
, with file URLs and modern Objective-C nullability bells & whistles.
这是一个使用-subpathsOfDirectoryAtPath:rootPath
, 文件 URL 和现代 Objective-C 可空性的解决方案。
typedef void (^FileEnumerationBlock)(NSURL *_Nonnull fileURL);
@interface NSFileManager (Extensions)
- (void)enumerateWithRootDirectoryURL:(nonnull NSURL *)rootURL
fileHandler:(FileEnumerationBlock _Nonnull)fileHandler
error:(NSError *_Nullable *_Nullable)error;
@end
@implementation NSFileManager (Extensions)
- (void)enumerateWithRootDirectoryURL:(NSURL *)rootURL
fileHandler:(FileEnumerationBlock)fileHandler
error:(NSError **)error {
NSString *rootPath = rootURL.path;
NSAssert(rootPath != nil, @"Invalid root URL %@ (nil path)", rootURL);
NSArray *subs = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:rootPath
error:error];
if (!subs) {
return;
}
for (NSString *sub in subs) {
fileHandler([rootURL URLByAppendingPathComponent:sub]);
}
}
@end
… and the same in Swift:
……在 Swift 中也是如此:
func enumerate(rootDirectoryURL rootURL: NSURL, fileHandler:(URL:NSURL)->Void) throws {
guard let rootPath = rootURL.path else {
preconditionFailure("Invalid root URL: \(rootURL)")
}
let subs = try NSFileManager.defaultManager().subpathsOfDirectoryAtPath(rootPath)
for sub in subs {
fileHandler(URL: rootURL.URLByAppendingPathComponent(sub))
}
}
回答by Avijit Nagare
This code worked for me.
这段代码对我有用。
NSMutableString *allHash;
-(NSString*)getIterate:(NSString*)path {
allHash = [NSMutableString stringWithString:@""];
NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:path];
NSString *file;
BOOL isDirectory;
for(file in de)
{
//first check if it's a file
NSString* fullPath = [NSString stringWithFormat:@"%@/%@",path,file];
BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory];
NSLog(@"Check=>%d",fileExistsAtPath);
if (!isDirectory) //its a file
{
//Do with filepath
}
else{ //it's a folder, so recurse
[self enumerateFolder:fullPath];
}
}
return allHash;
}
-(void) enumerateFolder:(NSString*)fileName
{
NSDirectoryEnumerator *de= [[NSFileManager defaultManager] enumeratorAtPath:fileName];
NSString* file;
BOOL isDirectory;
for(file in de)
{
//first check if it's a file
BOOL fileExistsAtPath = [[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory];
if (fileExistsAtPath) {
if (!isDirectory) //its a file
{
//Do with file
}
else{ //it's a folder, so recurse
[self enumerateFolder:file];
}
}
else printf("\nenumeratefolder No file at path %s",[file UTF8String]);
}
}
回答by arango_86
In Swift we can try the following.
在 Swift 中,我们可以尝试以下操作。
let docsDir = NSHomeDirectory().appending("/Documents")
let localFileManager = FileManager()
let dirEnum = localFileManager.enumerator(atPath: docsDir)
while let file = dirEnum?.nextObject() as? String {
if file.hasSuffix(".doc") {
print(docsDir.appending("/\(file)"))
}
}
Referencehttps://developer.apple.com/documentation/foundation/filemanager/1408726-enumerator
参考https://developer.apple.com/documentation/foundation/filemanager/1408726-enumerator