如何使用Objective-C读取特定文件夹中的文件?

时间:2010-12-16 07:20:47

标签: objective-c cocoa

我是Objective-C的新手。现在,我正在处理文件。我的问题是...... 如何在特定文件夹中搜索文件?

让我们说,我得到一个输入字符串“input”。现在我要做的就是从特定路径搜索并读取文件“input.txt”,也许是“user / desktop / files”文件夹。我该怎么做呢? 我知道使用NSFileHandle通过指定完整路径来读取文件。但我不知道该怎么做。 请帮帮我。

谢谢

3 个答案:

答案 0 :(得分:3)

您应该考虑使用一些NSString方法。

// path contains the path to the folder you want to find the file in.

// create the full file name

NSString* shortPath = [@"input" stringByAppendingPathExtension: @"txt"];
NSString* fullPath = [path stringByAppendingPathComponent: shortFileName];

// open the file.  we convert to an NSURL so we can use the better open method
NSURL* fileURL = [NSURL fileURLWithPath: fullPath];
NSError* error = nil;
NSFileHandle *file=[NSFileHandle fileHandleForReadingFromURL: fileURL
                                                       error: &error];
if (file == nil)
{
    // error contains info on what went wrong
}
else
{
    // do what you need
}

答案 1 :(得分:3)

通常,要使用路径,可以使用NSPathUtilities.h中定义的以下方法(而不是NSString.h本身):

@interface NSString (NSStringPathExtensions)

+ (NSString *)pathWithComponents:(NSArray *)components;
- (NSArray *)pathComponents;

- (BOOL)isAbsolutePath;

- (NSString *)lastPathComponent;   // frequently-used
- (NSString *)stringByDeletingLastPathComponent;   // frequently-used
- (NSString *)stringByAppendingPathComponent:(NSString *)str;   // frequently-used

- (NSString *)pathExtension;   // frequently-used
- (NSString *)stringByDeletingPathExtension;   // frequently-used
- (NSString *)stringByAppendingPathExtension:(NSString *)str;   // frequently-used

- (NSString *)stringByAbbreviatingWithTildeInPath;
- (NSString *)stringByExpandingTildeInPath;

- (NSString *)stringByStandardizingPath;

- (NSString *)stringByResolvingSymlinksInPath;

- (NSArray *)stringsByAppendingPaths:(NSArray *)paths;

- (NSUInteger)completePathIntoString:(NSString **)outputName
   caseSensitive:(BOOL)flag matchesIntoArray:(NSArray **)outputArray
   filterTypes:(NSArray *)filterTypes;

- (__strong const char *)fileSystemRepresentation;
- (BOOL)getFileSystemRepresentation:(char *)cname maxLength:(NSUInteger)max;

@end

所以,你会做类似的事情:

NSString *fullpath = [[path stringByAppendingPathComponent:input]
     stringByAppendingPathExtension:@"txt"];

这些方法负责为您处理路径分隔符。

如果已知文件是文本文件,则可以在NSString中使用以下方法:

- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc
    error:(NSError **)error;
- (id)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc
    error:(NSError **)error;
+ (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc
    error:(NSError **)error;
+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc
    error:(NSError **)error;

/* These try to determine the encoding, and return the encoding which was used.
      Note that these methods might get "smarter" in subsequent releases of the
     system, and use additional techniques for recognizing encodings. If nil
     is returned, the optional error return indicates problem that was 
    encountered (for instance, file system or encoding errors). */
- (id)initWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc
    error:(NSError **)error;
- (id)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc
    error:(NSError **)error;
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc
    error:(NSError **)error;
+ (id)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc
     error:(NSError **)error;

/* Write to specified url or path using the specified encoding.
    The optional error return is to indicate file system or encoding errors.
*/
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile
    encoding:(NSStringEncoding)enc error:(NSError **)error;
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile
     encoding:(NSStringEncoding)enc error:(NSError **)error;

后者可用于写入文件。

你会发现Cocoa中的许多类都有从文件或URL本身读入的方法。例如,NSImage有一个从文件中读取的方法。您通常可以考虑比文件句柄更高级别的项目(尽管它们确实有它们的位置)。对于通用数据,始终有NSData也可以从文件读入。

要以编程方式获取文件夹中项目的列表,您可以使用NSFileManager,然后使用NSString的方法为各个项目构建路径。

哦,如果你还不知道的话,另一个提示。如果您在Xcode源代码窗口中,请按住Command键并双击任何类或方法名称或数据类型以打开该对象的头文件。例如,Command-双击NSString打开NSString.h。按住Command-Option并双击以打开Xcode帮助窗口并搜索突出显示的术语。

答案 2 :(得分:0)

好的,我刚刚在这里做了一些NSString ...

NSString *input=[TextInput stringValue];
NSString *path=@"/Users/mith/Desktop/files/";
NSString *fullpath=[NSString stringWithFormat:@"%@%@.txt",path,input];
NSFileHandle *file=[NSFileHandle fileHandleForReadingAtPath:fullpath];`

好的,这对我很有用......但是有更好的方法吗?

由于