本章和下一章节主要描述下Foundation框架处理文件的一些API类。
NSFileManager管理目录和文件
文件操作的所有工作基础全是由NSFileManager提供的,它提供了很多实用方法,基本使用方法如下:
主要功能
- 创建一个新文件。
- 从现有文件中读取数据。
- 将数据写入文件。
- 重命名文件。
- 删除文件。
- 测试文件是否存在。
- 确定文件的大小和其他属性。
- 复制文件。
- 测试两个文件的内容是否相同。
- 创建目录、读取目录的内容,或者删除目录。
- 链接文件,即同一个文件存在两个不同的名字,有时甚至位于不同的目录中。
文件操作
int main(int argc, const char * argv[]) {@autoreleasepool {//fileNSString *fname = @"testfile";NSFileManager *fm;NSDictionary *attr;//创建文件管理器对象fm = [NSFileManager defaultManager];//当前目录NSString *path = [fm currentDirectoryPath];if([fm fileExistsAtPath: fname] == NO){NSLog(@"file is not exsit");return 1; //文件不存在返回1}//创建一个副本if([fm copyItemAtPath:fname toPath:@"testfile" error:NULL] == NO){NSLog(@"file copy failed");return 2;}//测试两个文件是否一样if([fm contentsEqualAtPath: fname andPath:@"newfile"] == NO){NSLog(@"file copy failed");return 3;}//重命名副本if([fm moveItemAtPath:@"newfile" toPath:@"newfile2" error:NULL]){NSLog(@"file rename failed");return 4;}//得到文件属性if((attr = [fm attributesOfItemAtPath:@"newfile2" error:NULL])==nil){NSLog(@"can't get file attribute");return 5;}//文件大小NSLog(@"file size is %llu", [[attr objectForKey:NSFileSize] unsignedLongLongValue]);//删除原始文件if([fm removeItemAtPath:fname error:NULL] == NO){NSLog(@"file remove failed");return 6;}//读取文件内容NSString *fileContent = [NSString stringWithContentsOfFile:@"newfile2" encoding:NSUTF8StringEncoding error:NULL];}return 0;
}
目录操作
int main (int argc, const char * argv[])
{@autoreleasepool{NSString *dirName = @"testdir";NSString *path;NSFileManager *fm;//需要创建文件管理器的实例fm = [NSFileManager defaultManager];//获取当前目录path = [fm currentDirectoryPath];NSLog (@"Current directory path is %@", path);//创建一个新目录if ([fm createDirectoryAtPath: dirName withIntermediateDirectories: YES attributes: nil error: NULL] == NO) {NSLog (@"Couldn't create directory!");return 1;}//重命名新的目录if ([fm moveItemAtPath: dirName toPath: @"newdir" error: NULL] == NO) {NSLog (@"Directory rename failed!");return 2;}//更改目录到新的目录if ([fm changeCurrentDirectoryPath: @"newdir"] == NO) {NSLog (@"Change directory failed!");return 3;}//获取并显示当前的工作目录path =[fm currentDirectoryPath];NSLog (@"Current directory path is @", path);NSLog (@"All operations were successful!");}return (0);} // main
遍历文件目录
//方法1NSFileManager *fm1 = [NSFileManager defaultManager];NSString *path = [fm1 currentDirectoryPath];NSDirectoryEnumerator *dirEnum = [fm1 enumeratorAtPath: path];NSLog(@"%@", path);while( (path=[dirEnum nextObject])!=nil ){NSLog(@"%@", path);}//方法2NSArray *dirArray = [fm1 contentsOfDirectoryAtPath:path error:NULL];for (path in dirArray){NSLog(@"%@", path);}
NSData数据缓冲
NSData是一个内存缓冲区用来存储临时数据使用,它可以包含大量的字节,32位系统上最大2G数据,64位系统则没有限制。同样的提供了NSData和NSMutableData两个API,不可变和可变两种,NSData是不可变的创建后可以使用但不能改变其中的值内容。
static void dataFun (void) {const char *string = "Hi there, this is a C string!";NSData *data = [NSData dataWithBytes: stringlength: strlen(string) + 1];NSLog (@"data is %@", data);NSLog (@"%ld byte string is '%s'", [data length], [data bytes]);
} // dataFun2023-12-29 01:24:01.653998+0800 project01[95581:7974119] data is {length = 30, bytes = 0x48692074 68657265 2c207468 69732069 ... 73747269 6e672100 }
2023-12-29 01:24:01.654089+0800 project01[95581:7974119] 30 byte string is 'Hi there, this is a C string!'
读取文件
NSDate *fileData;fm = [NSFileManager defaultManager];//读取文件内容fileData = [fm contentsAtPath: @"newfile2"];if (fileData == nil){NSLog(@"file read failed");return 1;}//写文件if([fm createFileAtPath:@"newfile3" contents:fileData attributes:nil] == NO){NSLog(@"conld not create the copy");return 2;}
NSPathUtilities文件路径
一个工具包,它里面有很多包装好的类可方便调用。也提供了对路径的操作
路径操作
int main (int argc, const char * argv[])
{@autoreleasepool{NSString *fName = @"path.m";NSFileManager *fm;NSString *path, *tempdir,*extension,*homedir, *fullpath;NSString *components;fm = [NSFileManager defaultManager];//获取临时的工作目录tempdir = NSTemporaryDirectory ();NSLog (@"Temporary Directory is %@", tempdir);//从当前目录中提取基本目录path = [fm currentDirectoryPath];NSLog (@"Base dir is @", [path lastPathComponent]);//创建文件fName在当前目录中的完整路径fullpath = [path stringByAppendingPathComponent: fName];NSLog (@"fullpath to %@ is %@", fName, fullpath);//获取文件扩展名extension = [fullpath pathExtension];NSLog (@"extension for @ is @", fullpath, extension);//获取用户的主目录components = [homedir pathComponents];for ( path in components ){NSLog (@"g@", path);}}return (0);} // main
路径操作常用方法
- 根据components中的元素构造有效路径:+(NSString *) pathWithComponents: components
- 析构路径,获得组成此路径的各个部分:-(NSArray *)pathComponents
- 提取路径的最后一个组成部分:-(NSString *) lastPathComponent
- 从路径的最后一个组成部分中提取其扩展名:-(NSString *) pathExtension
- 将path添加到现有路径的末尾:-(NSString *) stringByAppendingPathComponent: path
- 将指定的扩展名添加到路径的最后一个组成部分:-(NSString *) stringByAppendingPathExtension: ext
- 删除路径的最后一个组成部分:-(NSString *) stringByDeletingLastPathComponent
- 从文件的最后一部分删除扩展名:-(NSString *) stringByDeletingPathExtension
- 将路径中的代字符扩展成用户主目录()或指定用户的主目录(user):-(NSString *) stringByExpandingTildelnPath
- 尝试解析路径中的符号链接:-(NSString *) stringByResolvingSymlinksInPath
- 通过尝试解析~、…(父目录符号)、.(当前目录符号)和符号链接来标准化路径:-(NSString *) stringByStandardizingPath
用户路径常用方法
- NSString *NSUserName (void):返回当前用户的登录名
- NSString *NSFullUserName (void):返回当前用户的完整用户名
- NSString *NSHomeDirectory(void):返回当前用户主目录的路径
- NSString *NSHomeDirectoryForUser (NSString *user):返回用户user的主目录
- NSString *NSTemporaryDirectory (void):返回可用于创建临时文件的路径目录
应用路径常用方法
为了保存数据直到下一次运行程序仍能够使用,可以使用Documents 目录。每个iOS应用都有自己的Documents 目录供数据写入。函数 NSSearchPathForDirectoriesInDomains 的第一个参数是指定需要查找目录的 路径。应用中的Caches目录也可以用来存储一些数据。对于iOS5来说,Apple鼓励开发者存储持久化数据到云端,表16.5列出了iOS中常用的目录。
- Documents (NSDocumentDirectory):用于写入应用相关数据文件的目录。在iOS中写入这里的文件能够与iTunes共享并访问,存储在这里的文件会自动备份到iCloud;
- Library/Caches (NSCachesDirectory):用于写入应用支持文件的目录,保存应用程序再次启动需要的信息。iTunes不会对这个目录的内容进行备份
- tmp (use NSTemporaryDirecory()):这个目录用于存放临时文件,在程序终止时需要移除这些文件。当应用程序不再需要这些临时文件时,应该将其从这个目录中删除
- Library/Preferences:这个目录包含应用程序的偏好设置文件。使用NSUserDefaults类进行偏好设置文件的创建、读取和修改
NSProcessInfo文件复制和环境信息
此类可以设置或检索正在运行的进程的信息。比如当前进程的信息、参数、进程标识符等。
复制文件
int main (int argc, const char * argv[])
{@autoreleasepool{NSFileManager *fm;NSString *source,*dest;BOOL isDir;NSProcessInfo *proc = [NSProcessInfo processInfo];NSArray *args = [proc arguments];fm = [NSFileManager defaultManager];//检查命令行中的两个参数if ([args count] != 3) {NSLog (@"Usage: %@ src dest", [proc processName]);return 1;}source = args[1];dest = args[2];//确定能够读取源文件if ([fm isReadableFileAtPath: source]==NO){NSLog (@"Can't read 8e", source);return 2;}//目录文件是否是同一个目录,如果是则添加到目录的结尾[fm fileExistsAtPath: dest isDirectory: &isDir];if (isDir == YES){dest = [dest stringByAppendingPathComponent:[source lastPathComponent]];}//若目标文件已存在,则删除文件[fm removeItemAtPath: dest error: NULL];//执行复制if ([fm copyItemAtPath: source toPath: dest error: NULL] == NO) {NSLog (@"Copy failed!");return 3;}NSLog (@"Copy of 8e to 8 succeeded!", source, dest);}return (0);} // main
常用方法
- +(NSProcessInfo *) processInfo : 返回当前进程的信息
- –(NSArray *) arguments: 以NSString对象数组的形式返回当前进程的参数
- –(NSDictionary *) environment:返回变量/值对词典,以描述当前的环境变量(比如PATH和HOME)及其值
- –(int) processIdentifier:返回进程标识符,它是操作系统赋予进程的唯一数字,用于识别每个正在运行的进程
- –(NSString *) processName:返回当前正在执行的进程名称
–(NSString *) globallyUniqueString:每次调用这个方法时,都返回不同的单值字符串。可以用这个字符串生成单值临时文件名 - –(NSString *) hostname :返回主机系统的名称(在笔者的OSX系统中,返回的是Steve-Kochans-Computer.local)
- –(NSUInteger) operatingSystem:返回表示操作系统的数字
- –(NSString *) operatingSystemName:返回操作系统的名称
- –(NSString *) operatingSystemVersionString:返回当前操作系统的版本,比如 Version 10.6.7(Build 10J869))
- –(void) setProcessName: (NSString *) name :将当前进程名称设置为name。应该谨慎地使用这个方法,因为关于进程名称存在一些假设(比如用户默认的设置)