转自:http://blog.csdn.net/javali1984/article/details/6559558
NSFileManager *fileManager = [NSFileManager defaultManager];
//在这里获取应用程序Documents文件夹里的文件及文件夹列表
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDir = [documentPaths objectAtIndex:0];
NSError *error = nil;
NSArray *fileList = [[NSArray alloc] init];
//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组
fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];
以下这段代码则可以列出给定一个文件夹里的所有子文件夹名
NSMutableArray *dirArray = [[NSMutableArray alloc] init];
BOOL isDir = NO;
//在上面那段程序中获得的fileList中列出文件夹名
for (NSString *file in fileList) {
NSString *path = [documentDir stringByAppendingPathComponent:file];
[fileManager fileExistsAtPath:path isDirectory:(&isDir)];
if (isDir) {
[dirArray addObject:file];
}
isDir = NO;
}
NSLog(@"Every Thing in the dir:%@",fileList);
NSLog(@"All folders:%@",dirArray);
ios访问Documents目录下的文件的注意点
ios访问Documents目录下的文件,注意:
1>.拼接的路径字符串是否正确;
2>.拼接的路径的方式:
第一种, 字符串变量 + ...+字符串常量 拼接:
demo1:
NSString* docPath = [NSHomeDirectory() stringByAppendingPathComponent: @"Documents"];
NSString* path = [NSString stringWithFormat: @"%@/%@", docPath, @"23.png"];
demo2:
NSString* docPath = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
NSString* path = [NSStringstringWithFormat: @"%@%@.png", docPath, aFileName];
"23.png", ".png"是我说的常量.
第二种, 字符串变量 + ...+字符串变量 拼接:
NSString* docPath = [NSHomeDirectory() stringByAppendingPathComponent: @"Documents"];
NSString* path = [NSString stringWithFormat: @"%@%@", docPath, aFileName];
现在要说的是第二种方法是错误的,因为在NSString字符串变量末位有'\0'字符,
而文件相关的API要求路径字符串末位不能包含'\0'字符,所以在路径format的时候要注意最后一个字符串不能为NSString
变量,必须为字符串常量.如果要在一个路径后面追加路径NSString变量, 请使用stringByAppendingPathComponent方法,
添加后缀请使用stringByAppendingPathExtension方法.
iOS 获取用户主目录
http://blog.sinzy.net/jinjian/entry/22283
使用底层的C函数NSHomeDirectory() 能够访回当前app当前用户的主目录
用户数据都建议放在/Documents中
每一个iOS应用沙盒都有/Documents目录
NSString *path = [NSHomeDirectory() stringByAppendingString:USER_FILE];
补方法二
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
[paths objectAtIndex:0] 即为/Documents根目录
NSString *plistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"myfile.txt"];
iOS中对文件的操作
http://marshal.easymorse.com/archives/3340
因为应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:
Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
在Documents目录下创建文件
代码如下:
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
, NSUserDomainMask
, YES);
NSLog(@"Get document path: %@",[paths objectAtIndex:0]);
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"];
NSString *content=@"a";
NSData *contentData=[content dataUsingEncoding:NSASCIIStringEncoding];
if ([contentData writeToFile:fileName atomically:YES]) {
NSLog(@">>write ok.");
}
可以通过ssh登录设备看到Documents目录下生成了该文件。
上述是创建ascii编码文本文件,如果要带汉字,比如:
NSString *fileName=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"myFile"];
NSString *content=@"更深夜静人已息";
NSData *contentData=[content dataUsingEncoding:NSUnicodeStringEncoding];
if ([contentData writeToFile:fileName atomically:YES]) {
NSLog(@">>write ok.");
}
如果还用ascii编码,将不会生成文件。这里使用NSUnicodeStringEncoding就可以了。
通过filezilla下载到创建的文件打开,中文没有问题:
在其他目录下创建文件
如果要指定其他文件目录,比如Caches目录,需要更换目录工厂常量,上面代码其他的可不变:
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory
, NSUserDomainMask
, YES);
使用NSSearchPathForDirectoriesInDomains只能定位Caches目录和Documents目录。
tmp目录,不能按照上面的做法获得目录了,有个函数可以获得应用的根目录:
NSHomeDirectory()
也就是Documents的上级目录,当然也是tmp目录的上级目录。那么文件路径可以这样写:
NSString *fileName=[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/myFile.txt"];
或者,更直接一点,可以用这个函数:
NSTemporaryDirectory()
不过生成的路径将可能是:
…/tmp/-Tmp-/myFile.txt
使用资源文件
在编写应用项目的时候,常常会使用资源文件,比如:
安装到设备上后,是在app目录下的:
以下代码演示如何获取到文件并打印文件内容:
NSString *myFilePath = [[NSBundle mainBundle]
pathForResource:@"f"
ofType:@"txt"];
NSString *myFileContent=[NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"bundel file path: %@ \nfile content:%@",myFilePath,myFileContent);
代码运行效果: