NSFileHandle类是一个针对文件描述符的面向对象封装类。可以使用文件处理对象来访问与文件、sockets、管道pipes和设备相联系的数据。
对于文件,你可以在文件中读、写、查找。对于套接字sockets、pipes和devices,可以使用处理对象来异步监视设备和进程数据。
大部分NSFileHandle类的创建方法都能使文件处理对象获得相关联的文件描述符的所有权。这意味着文件处理对象既负责创建文件描述符也必须负责之后关闭文件,但关闭文件通常发生在文件处理对象销毁时。如果你想使用一个通过你创建的文件描述符对应的文件处理对象,可使用initWithFileDescriptor:和initWithFileDescriptor:closeOnDealloc:方法来创建一个File Handle。注意,在调用initWithFileDescriptor:closeOnDealloc:方法创建一个File Handle时,closeOnDealloc:的参数必须为NO。
运行回路考虑:
当你使用一个文件处理对象与套接字进行异步通信时,你必须在有效的运行回路(an active run loop)的线程中初始化相应的操作。尽管在线程的后台异步运行读、写、等待操作,但文件处理使用了一个运行回路源来监视这些操作并且准确的通知到你的代码。因此,你必须在你的应用主线程中,或者在你已经设置的一个运行回路的某个线程,调用这些方法,并且使用它来处理事件。
可以通过 NSFileManager 类对文件或目录执行基本操作。下面的大部分操作有对应的 URL 版本。
// 创建文件管理器
+ (NSFileManager *)defaultManager
// 查看目录
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
- (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path
// 创建/删除项
- (BOOL)createDirectoryAtPath:(NSString *)path
withIntermediateDirectories:(BOOL)createIntermediates
attributes:(NSDictionary *)attributes
error:(NSError **)error
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents
attributes:(NSDictionary *)attributes
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error
// 复制/移动项
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath
error:(NSError **)error
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath
error:(NSError **)error
// 创建符号链接和硬链接
- (BOOL)createSymbolicLinkAtPath:(NSString *)path
withDestinationPath:(NSString *)destPath
error:(NSError **)error
- (BOOL)linkItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath
error:(NSError **)error
- (NSString *)destinationOfSymbolicLinkAtPath:(NSString *)path
error:(NSError **)error
// 检测文件
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory
// 取得/设置属性
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error
- (BOOL)setAttributes:(NSDictionary *)attributes ofItemAtPath:(NSString *)path
error:(NSError **)error
// 取得/比较文件内容
- (NSData *)contentsAtPath:(NSString *)path
- (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2
// 将文件路径转换为字符串
- (const char *)fileSystemRepresentationWithPath:(NSString *)path
- (NSString *)stringWithFileSystemRepresentation:(const char *)string
length:(NSUInteger)len
// 取得/更改当前目录
- (NSString *)currentDirectoryPath
- (BOOL)changeCurrentDirectoryPath:(NSString *)path
这里涉及到了 NSData 类,它可以用来设置缓冲区。它是不可变的,对应的有可变的 NSMutableData 。
下面是一些 NSData 类的方法。
// 创建和初始化缓冲区,有对应的initWith版本
+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length
+ (id)dataWithContentsOfFile:(NSString *)path
+ (id)dataWithContentsOfURL:(NSURL *)aURL
+ (id)dataWithData:(NSData *)aData
// 取得数据
- (const void *)bytes
- (void)getBytes:(void *)buffer length:(NSUInteger)length
- (void)getBytes:(void *)buffer range:(NSRange)range
// 取得长度
- (NSUInteger)length
// 比较数据
- (BOOL)isEqualToData:(NSData *)otherData
// 存储数据
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)mask
error:(NSError **)errorPtr
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)atomically
- (BOOL)writeToURL:(NSURL *)aURL options:(NSDataWritingOptions)mask
error:(NSError **)errorPtr
下面是 NSMutableData 增加的一些方法。
// 创建一定大小的空的/初始化为0的可变缓冲区,有对应的initWith版本
+ (id)dataWithCapacity:(NSUInteger)aNumItems
+ (id)dataWithLength:(NSUInteger)length
// 更改容量
- (void)setLength:(NSUInteger)length
// 取得数据
- (void *)mutableBytes
// 增加数据
- (void)appendBytes:(const void *)bytes length:(NSUInteger)length
- (void)appendData:(NSData *)otherData
// 修改数据:替换、重置0、重设
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)bytes
- (void)resetBytesInRange:(NSRange)range
- (void)setData:(NSData *)aData
还有一些用于文件路径管理的全局函数。
// 返回当前用户的登录名/全名
NSString *NSUserName(void);
NSString *NSFullUserName(void);
// 返回用户的主目录
NSString *NSHomeDirectory(void);
NSString *NSHomeDirectoryForUser(NSString *userName);
// 返回临时文件目录
NSString *NSTemporaryDirectory(void);
NSString 类也包含一些用于路径和URL处理的方法。
文件的读写使用 NSFileHandle 类的方法来完成。
// 打开文件准备读取/写入/更新
+ (id)fileHandleForReadingAtPath:(NSString *)path
+ (id)fileHandleForWritingAtPath:(NSString *)path
+ (id)fileHandleForUpdatingAtPath:(NSString *)path
// 打开标准输入/标准输出/标准错误/空设备
+ (id)fileHandleWithStandardInput
+ (id)fileHandleWithStandardOutput
+ (id)fileHandleWithStandardError
+ (id)fileHandleWithNullDevice
// 初始化文件处理对象
- (id)initWithFileDescriptor:(int)fileDescriptor
// 返回文件描述符
- (int)fileDescriptor
// 读写数据
- (NSData *)availableData
- (NSData *)readDataToEndOfFile
- (NSData *)readDataOfLength:(NSUInteger)length
- (void)writeData:(NSData *)data
// 文件定位
- (unsigned long long)offsetInFile
- (unsigned long long)seekToEndOfFile
- (void)seekToFileOffset:(unsigned long long)offset
// 扩展或截断文件
- (void)truncateFileAtOffset:(unsigned long long)offset
// 同步文件
- (void)synchronizeFile
// 关闭文件
- (void)closeFile
转载于:https://blog.51cto.com/lfhzxl/981006