1.对文件本身进行操作,使用NSFileManager
对于NSFileManager,文件或目录是使用文件的路径名的唯一标示。每个路径名都是一个NSString对象,它既可以是相对路径,也可以是绝对路径。相对路径是相对于当前的目录的路径名。绝对路径以/开始,斜线实际上就是一个目录称为根目录,例如:/Users/stevekochan,这个路径名指定了三个目录:/,Users和stevekochan。特殊的代字符(~)作为用户的主目录的缩写。其他特殊的UNIX风格的路径名字符,如表示当前目录“.”和表示父目录的“..”,需要在使用Foundation的文件处理方法之前将这些字符从路径明中移除。
代码展示:
#import<Foundation/Foundation.h>
#define PATH @"/Users/md101/Desktop"
#define ERROR(A) if(A){NSLog(@"%@",A);}
int main ()
{
@autoreleasepool {
//创建一个单例的NSFileManager对象
NSFileManager *fm = [NSFileManagerdefaultManager];
//查看指定目录下的文件和文件夹(浅度遍历)
NSError *error = nil;
NSArray *array = [fm contentsOfDirectoryAtPath:PATHerror:&error];
if (error) {
NSLog(@"%@",error);
exit(-1);
}//文件操作需要报错
NSLog(@"content of PATH:%@",array);
//深度遍历 遍历指定目录下的所有文件的文件夹
array = [fmsubpathsOfDirectoryAtPath:PATHerror:&error];
if (error) {
NSLog(@"%@",error);
exit(-1);
}
NSLog(@"sub content of PATH:%@",array);
//在指定目录创建新目录 Path要写全路径
//第二个参数表示是否创建中间路径
//第三个参数表示文件属性
[fmcreateDirectoryAtPath: [NSStringstringWithFormat:@"%@/mildle/test1",PATH]withIntermediateDirectories:YES
attributes:nilerror:&error];
if (error) {
NSLog(@"%@",error);
exit(-1);
}
//在制定目录下创建文件
//第二个参数表示文件的内容,当其参数为nil时表示创建时不传入内容
[fmcreateFileAtPath:[NSStringstringWithFormat:@"%@/mildle/test1/testfile",PATH] contents:[@"hello "dataUsingEncoding:NSUTF8StringEncoding]attributes:nil];
//删除目录和文件
/* [fm removeItemAtPath:[NSString stringWithFormat:@"%@/mildle/test1/testfile",PATH] error:nil];
ERROR(error);*/
//复制文件和目录
//第一个参数是源文件或目录的路径
//第二个参数是目的文件或目录的路径
[fmcopyItemAtPath:[NSStringstringWithFormat:@"%@/mildle",PATH]toPath:[NSStringstringWithFormat:@"%@/mildle2",PATH] error:&error];
//移动文件或者目录
[fmmoveItemAtPath:[NSStringstringWithFormat:@"%@/mildle",PATH]toPath:[NSStringstringWithFormat:@"%@/mildle2/testfile2",PATH] error:&error];
}
return 0;
}
-(BOOL)removeFileAtPath: path error: err 删除一个文件
-(BOOL)movePath: from toPath: to error: err重命名或移动一个文件(to不能已经存在)
-(BOOL)copyPath:from toPath:to error: err 复制文件 (to不能存在)
-(BOOL)contentsEqualAtPath:path1 andPath:path2 比较两个文件的内容
-(BOOL)fileExistsAtPath:path 测试文件是否存在
-(BOOL)isReadablefileAtPath:path 测试文件是否存在,且是否能执行读操作
-(BOOL)isWritablefileAtPath:path 测试文件是否存在,且是否能执行写操作
-(NSDictionary *)attributesOfItemAtPath:path error: err 获取文件的属性
-(BOOL)setAttributesOfItemAtPath: attr error: err 更改文件的属性
-(NSString *)currentDirectoryPath 获取当前目录
-(BOOL)changeCurrentDirectoryPath:path 更改当前目录
-(BOOL)copyPath:from toPath:to error: err 复制目录结构,to不能已经存在
-(BOOL)createDirectoryAtPath:path withIntermediateDirectories: (BOOL) flag attributes:attr 创建目录
-(BOOL)fileExistsAtPath:path isDirectory:(BOOL *)flag 测试文件是否为目录 (flag存储结构yes/no)
-(NSArray *)contentsOfDirectoryAtPath:path error: err 列出目录的内容
-(NSDirectoryEnumerator *)enumeratorAtPath:path 枚举目录的内容
-(BOOL)removeItemAtPath:path error: err 删除空目录
-(BOOL)moveItemPath:from toPath:to error: err 重命名或移动一个目录,to不能是已经存在的
注释:-(BOOL)changeCurrentDirectoryPath:path 更改当前目录 ,相当于将文件指针从一个文件移到另一个文件,对另一个文件进行操作。
其中attr表示文件的权限,属性字典允许你指定要创建的文件的权限,以便获取或者更改现有文件的信息。对于文件创建,如果将该参数指定为nil,该文件会被设置为默认权限。对于现有 文件,属性字典包括各种信息,如文件的所有者,文件的大小,文件的创建日期等。
枚举目录中的内容:
1.使用-(NSDirectoryEnumerator *)enumeratorAtPath:path 方法,一次可以枚举指定目录中的每个文件,默认情况下,如果其中一个文件为目录,那么也会递归枚举他的内容。在这个过程中,通过向枚举对象发送一条skipDescendants消息,可以动态阻止递归过程,从而不再枚举目录中的内容。
2.使用contentsOfDirectoryAtPath:path error: err方法可以枚举指定目录的内容,并在一个数组中返回文件列表,如果这个目录中的任何文件本身是一个目录,这个方法并不会枚举他的内容。
枚举代码如下:
- (NSString *)lastPathComponent 提取路径中的最后一个组成部分
- (NSString *)pathExtension 从路径中最后一个组成部分中提取扩展名
- (NSString *)stringByAppendingPathCom
- (NSString *)stringByAppendingPathExt
- (NSString *)stringByDeletingLastPath
- (NSString *)stringByDeletingPathExte
- (NSString *)stringByExpandingTildeIn
- (NSString *)stringByResolvingSymlink
- (NSString *)stringByStandardizingPat
常用的路径工具函数:
NSString * NSUserName (void);· ··············································
NSString * NSFullUserName (void);
返回当前用户的完整用户名
NSString * NSHomeDirectory (void);
返回当前用户主目录的路径
NSString * NSHomeDirectoryForUser ( NSString *userName)
返回用户userName的主目录
NSString * NSTemporaryDirectory (void);
返回可用于创建临时文件的路径目录
代码如下:
代码展示及说明:
这里需要注意,只为方法-(BOOL)movePath: from toPath: to error: err和-(BOOL)copyPath:from toPath:to error: err指定目标目录,并不能够将文件或复制到这个目录中,必须明确的制定目标目录中的文件名。 在执行复制,重命名或移动操作的时候,目标文件不能是已经存在的,否则,操作将会失败。
-(NSDate *)contentsAtPath:path 从文件中读取数据,如果读取成功,这个方法返回存储区对象作为结果。否则将返回nil,(例如该文件不存在或者不能够读取)
+ (NSProcessInfo *)processInfo
返回当前进程信息
- (NSArray *)arguments
以NSString对象数字的形式返回当前进程的参数
- (NSDictionary *)environment
返回变量/值对字典,以描述当前的环境变量(比如PATH等等)
- (int)processIdentifier
返回进程PID
- (NSString *)processName
返回当前正在执行的进程名称
- (NSString *)globallyUniqueString
每次调用该方法时,都会返回不同的单值字符串,可以生成临时文件名
- (NSString *)hostName
返回主机系统名
- (NSUInteger)operatingSystem
返回表示操作系统的数字
- (NSString *)operatingSystemName
返回操作系统的名称
- (NSString *)operatingSystemVersionSt
返回操作系统版本
- (void)setProcessName: (NSString *)name
修改当前进程名(谨慎使用)
代码说明:
常见的NSFileManager文件方法:
-(NSDate *)contentsAtPath:path 从文件中读取数据
-(BOOL)createFileAtPath:path contents:(NSDate *)data attributes:attr 向一个文件写入数据
常见的NSFileManager目录方法:
NSFileManager *fm = [NSFileManagerdefaultManager];
NSString *path = [fmcurrentDirectoryPath];
NSLog(@"%@",path);
NSDirectoryEnumerator *dictenum = [fmenumeratorAtPath:PATH];
BOOL flag;
while ((path = [dictenum nextObject])!=nil) {
[fm fileExistsAtPath:PATHisDirectory:&flag];
if (flag == YES) {
[dictenum skipDescendants];
}
NSLog(@"%@",path);
}
使用路径
NSPathUtilities.h包含了NSString的函数和分类扩展,它允许你操作路径名。应该尽可能使用这些函数,以便使程序更独立于文件系统结构及特定文件和目录位置。
常用的路径处理方法:
+ (NSString *)pathWithComponentsNSArray *)components 根据components中的元素来构建路径.
- (NSArray *)pathComponents 析构路径,返回构成路径的各个部分.
···············返回当前用户的登录名
你可能还想查看Foundation函数NSSearchPathForDirectoriesInDomains(),它可用于查找系统的特殊目录,如果Application和Document目录。例如,定义一个方法saveFilePath,他返回文件saveFile在Document目录中的路径,这个方法可以用于应用程序里保存一些数据到一个文件中。
-(NSString *) saveFilePath
{
NSArray *dirList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomairMask,YES);
//函数NSSearchPathForDirectoriesInDomains()的第一个参数是指定需要查找目录的路径,第二个参数可以是多个值,用于指定需要列出的目录,如用户的,系统的或者所有目录。最后一个参数用于用于指定是否展开路径中的~字符。该函数返回一组路径的数组。如果第二个参数指定多个值,该数组会包含多个元素。
NSString *docDir = [dirList objectAtIndex: 0];
return [docDir stringByAppendingPathComponent :@"saveFile"];
}
为了保存数据到下一次程序运行时仍能够继续使用,可以使用Document目录。每个iOS应用程序都有自己的Document目录供数据写入。
常用iOS目录:
Documents(NSDocumentDirectory) //用于写入应用相关数据文件的目录,在ios中写入这里的文件能够与iTunes共享并访问,存储在这里的文件会自动备份到云端
Library/Caches(NSCachesDirectory) //用于写入应用支持文件的目录,保存应用程序再次启动需要的信息。iTunes不会对这个目录的内容进行备份
tmp(use NSTemporaryDirectory()) //这个目录用于存放临时文件,只程序终止时需要移除这些文件,当应用程序不再需要这些临时文件时,应该将其从这个目录中删除
Library/Preferences //这个目录包含应用程序的偏好设置文件,使用 NSUserDefault类进行偏好设置文件的创建、读取和修改
NSString *fName =@"path.m";
NSFileManager *fm;
NSString *path,*tempdir,*extension,*homedir,*fullpath;
NSArray *components;
fm = [NSFileManagerdefaultManager];
// 获取临时工作目录
tempdir = NSTemporaryDirectory();
NSLog(@"TemporaryDictionary is %@",tempdir);
//从当前目录中提取基本目录
path = [fm currentDirectoryPath];
NSLog(@"Base dir is %@",[pathlastPathComponent]);
//创建文件fName在当前目录的完整路径
fullpath = [path stringByAppendingPathComponent:fName];
NSLog(@"fullpath to %@ is %@",fName,fullpath);
//获取文件的扩展名
extension = [fullpath pathExtension];
NSLog(@"extensize for %@ is %@",fullpath,extension);
//获取用户的主目录
homedir = NSHomeDirectory();
NSLog(@"your home derectory is %@",homedir);
//拆分路径为各组成分
components= [fullpath pathComponents];
for(path in components)
{
NSLog(@"%@",path);
}
这里注意:NSTemporaryDirectory()返回系统中可以用来创建临时文件的目录路径名,如果在这个目录中创建临时文件,一定要在完成任务后将它们删除,另外确保文件名是唯一的。特别是在应用程序的多个实例同时在运行时更应该如此。如果多个用户登陆到系统,并且同时运行同一个应用程序,这种情况就很容易发生。如果你创建的临时文件并未删除,系统将会为你删除,然而最好不要依靠系统来删除,而是自己删除。
- (NSString *)lastPathComponent 提取路径中的最后一个组成部分,当你有绝对路径并且想从中获取基本文件名时,可以使用它。
- (NSString *)stringByAppendingPathCom
- (NSString *)pathExtension 从路径中最后一个组成部分中提取扩展名,如果所给的文件没有扩展名,那么方法仅仅返回一个空字符串。
NSHomeDirectory()函数返回当前用户的主目录。使用NSHomeDiretoryForUser函数,同时提供用户名作为函数的参数,可以获得任何特定用户的主目录。
复制文件和使用NSProcsessInfo类
常用的NSProcessInfo类方法:
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]);
}
source = [args objectAtIndex:1];
dest = [args objectAtIndex:2];
NSLog(@"%@ %@",source,dest);
//确定能够读取源文件
if ([fm isReadableFileAtPath:source] ==NO) {
NSLog(@"Can't read %@",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 %@ to %@ succeeded!",source,dest);
2.对文件内容进行操作,使用NSHandle
使用文件时,需要频繁的将数据读入到一个一个临时数据区,这个时候临时存储区通常称为缓冲区。当收集数据,以便随后将这些数据输出到文件中,通常也使用存储区。Foundation的NSData类提供了一种简单的方式,它用来设置缓冲区,将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件中。
常用的NSFileHandle方法:
有两个操作,分别为读操作写操作
代码展示及说明:
#import <Foundation/Foundation.h>
#define PATH @"/Users/md101/Desktop"
#define ERROR(A) if(A){NSLog(@"%@",A);}
int main ()
{
@autoreleasepool {
/*NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:[NSString stringWithFormat:@"%@/testfile/file",PATH] contents:[@"hello word!"dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
//以只读方式打开文件生成文件句柄
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:@"/Users/md101/Desktop/testfile/file"];
//从文件中读取三个字节的内容
NSData *date1 = [handle readDataOfLength:3];
NSString *str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//接着从上一次读过的字节数之后继续读5个字节
date1 = [handle readDataOfLength:5];
str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//一次性从上一次的文件指针到文件尾将文件的所有内容全部读入
NSData *date1 = [handle readDataToEndOfFile];
NSString *str = [[NSString alloc] initWithData:date1 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);*/
//以只写方式打开文件
//此时文件的内容并没有像C语言中那样删除,也并不会在已有内容之后继续写入内容
NSFileHandle *handle = [NSFileHandlefileHandleForWritingAtPath:@"/Users/md101/Desktop/testfile/file"];
//将文件的内容截短至0字节,以便清空文件的内容
//[handle truncateFileAtOffset:0];
//将读写指针设置到文件尾,以便实现追加写操作
[handleseekToEndOfFile];
[handlewriteData:[@"hello"dataUsingEncoding:NSUTF8StringEncoding]];
}
return 0;
}
使用NSURL类
NSURL类提供在应用中使用URL地址的相关的方法。例如:给出映射到互联网上的一个文件路径的HTTP地址,调用一些方法就很容易读取这些文件的内容。NSURL对象并不是一个字符串(比如:@“http:/www.apple.com”),但是使用URLWithString:方法可以有一个字符串对象创建出NSURL对象。
//从网页上读取代码
NSURL *myURL = [NSURL URLWithString:@"http://www.baidu.com/"];
NSString *myHomePage = [NSString stringWithContentsOfURL:myURL encoding:NSASCIIStringEncoding error:NULL];
NSLog(@"%@",myHomePage);
如果词典作为属性列表存储在一个网址上,使用 dictionaryWithContentsOfURL:(NSURL *) 方法同样可以读取,或者数组存储在属性列表,可以使用 arrayWithContentsOfURL:(NSURL *)方法。如果希望从一个网站中读取任何一个数据类型,可以使用dataWithContentOfURL:方法。使用NSBundle类
当创建一个应用时,系统存储了应用的相关联的所有数据(包括图片,本地化字符串和图标等),将这些内容放入一个成为应用包。为了访问应用中这些资源,需要熟悉NSBnudle类。
下面语句能够返回存储在应用包中得instructions.txt文件路径:
NSString *txtFilePath = [[NSBundle mainBundle] pathforResource: @"instructions"ofType:@"txt"];
mainBundle方法给出了应用包所在的目录。pathforResource:ofType:方法会列出该目录指定的文件并返回文件路径,随后就可以读取文件内容到程序中:
NSString * instructions = [NSString stringWithContentsOfFile:txtFilePath encoding:NSUTF8StringEncoding error:NULL];
如果希望列出在应用包中的图片目录中所有以jpg为文件后缀名的JPEG图片,需要使用到pathsForResourcesOfType: inDirectory:方法:
NSArray * birds = [NSBundle mainBundle]pathsForResourcesOfType:@"jpg" inDirectory:@"birdImages"];
这个方法返回路径名的数组。如果JPEG图片并未存储在应该的子目录中,inDirectory :的参数可以指定为@“”。