http://blog.sina.com.cn/s/blog_9cd1705d01011gel.html
iphone创建文件
2点:
1、创建多级目录的文件时,要先判断其目录是否存在,如果不存在就创建该目录,如果没有创建该目录,文件是不能创建成功的
、不要使用- (BOOL)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary *)attributes,这个方法在模拟器中可能能成功运行,但在设备上肯定不行的,
改用- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error,
createIntermediates设置为YES,这样就能建立多级目录了。如果是一级目录,可以设置为NO。
如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *strFile = [documentsDirectory stringByAppendingPathComponent:@"hello/config.plist"];
NSLog(@"strFile: %@", strFile);
NSString *strPath = [documentsDirectory stringByAppendingPathComponent:@"hello"];
NSLog(@"there is no Directory: %@",strPath);
[[NSFileManager defaultManager] createDirectoryAtPath:strPath withIntermediateDirectories:YES attributes:nil error:nil];
在应用程序执行时,经常需要本地化保存一些重要的数据,这时就有可能需要创建一些目录。Objective-C提供了一个非常强大的创建目录的接口:
|
很多人使用这个接口时,往往将attributes参数设置为nil,这样虽然能够创建出目录,但是在一些特殊场景下(比如iPhone的apps)所创建的目录的属性往往不是我们期望的,因而导致目录的读写失败等问题。其实通过设置attributes参数,这个接口可以完成我们的期望。
根据苹果官方文档介绍,这个参数可以设置所创建目录所属的用户和用户组,目录的访问权限和修改时间等。如果设置为nil,那么所创建目录的属性则采用系统默认设置,一般会将目录的用户设置为root,访问权限设置为0755,这样就导致其他用户向这个目录写入时失败。
attributes参数是一个字典类型。查看苹果官方文档的介绍,可以看到在NSFileManager.h头文件定义了很多常量字符串,用于作为attributes字典的键,针对于这个接口的键主要包括下面几个:
|
本文不打算翻译苹果的官方文档,只把我们比较关心的几个键的意义说明如下:
- NSFileAppendOnly
这个键的值需要设置为一个表示布尔值的NSNumber对象,表示创建的目录是否是只读的。
- NSFileCreationDate
这个键的值需要设置为一个NSDate对象,表示目录的创建时间。
- NSFileOwnerAccountName
这个键的值需要设置为一个NSString对象,表示这个目录的所有者的名字。
- NSFileGroupOwnerAccountName
这个键的值需要设置为一个NSString对象,表示这个目录的用户组的名字。
- NSFileGroupOwnerAccountID
这个键的值需要设置为一个表示unsigned int的NSNumber对象,表示目录的组ID。
- NSFileModificationDate
这个键的值需要设置一个NSDate对象,表示目录的修改时间。
- NSFileOwnerAccountID
这个键的值需要设置为一个表示unsigned int的NSNumber对象,表示目录的所有者ID。
- NSFilePosixPermissions
这个键的值需要设置为一个表示short int的NSNumber对象,表示目录的访问权限。
- NSFileReferenceCount
这个键的值需要设置为一个表示unsigned long的NSNumber对象,表示目录的引用计数,即这个目录的硬链接数。
这样,通过合理的设计attributes字典中的不同键的值,这个接口所创建的目录的属性就会基本满足我们的需求了。
http://www.open-open.com/lib/view/open1428650503546.html
1、创建一个文件管理器
NSFileManager *fm = [NSFileManager defaultManager];
2、浅度遍历目录
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
3、深度遍历目录
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
4、获取当前目录
- (NSString *)currentDirectoryPath
5、更改当前目录
- (BOOL)changeCurrentDirectoryPath:(NSString *)path
6、枚举目录内容
- (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path
7、创建目录
- ( BOOL )createDirectoryAtPath:(NSString *)path withIntermediateDirectories:( BOOL )createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error
8、创建文件
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary *)attributes
9、复制文件
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
10、删除文件
- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error
11、目录/文件拷贝
- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
12、移动/重命名文件或者目录
- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
13、测试文件是否存在
- (BOOL)fileExistsAtPath:(NSString *)path
14、获取文件信息(属性和权限)
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error
15、从文件中读取数据
- (NSData *)contentsAtPath:(NSString *)path
16、比较两个文件的内容
- (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2
17、测试文件是否存在,且是否能执行读操作
- (BOOL)isReadableFileAtPath:(NSString *)path
18、测试文件是否存在,且是否能执行写操作
- (BOOL)isWritableFileAtPath:(NSString *)path
二、文件操作类NSFileHandle常用操作:
1、只读方式打开文件
+ (id)fileHandleForReadingAtPath:(NSString *)path
2、只写方式打开文件
+ (id)fileHandleForWritingAtPath:(NSString *)path
3、读写方式打开文件
+ (id)fileHandleForUpdatingAtPath:(NSString *)path
4、从文件当前位置读到结尾
- (NSData *)readDataToEndOfFile
5、从文件当前位置读固定字节数的内容
- (NSData *)readDataOfLength:(NSUInteger)length
6、返回所有可用的数据
- (NSData *)availableData
7、写文件
- (void)writeData:(NSData *)data
8、定位到文件尾部
- (unsigned long long)seekToEndOfFile
9、定位到文件指定位置
- (void)seekToFileOffset:(unsigned long long)offset
10、获取当前文件的偏移量
- (unsigned long long)offsetInFile
11、将文件的长度设置为offset字节
- (void)truncateFileAtOffset:(unsigned long long)offset
关闭文件
- (void)closeFile
P.S. (网络socket中)通过initWithFileDescriptor初始化的对象,需要显式调用此方法;其它方法创建的对象会自动打开文件,该对象被销毁时会自动关闭该方法,不需显式调用此方法。