oc文件操作
从文件里读内容,写内容到文件里,做得字典,fopen fread fwrite fgets
1.对文件本身的操作(运行文件就能创建,移动,拷贝, 删除文件)
NSFileManger //文件管理器
NSFileManager * fm = [NSFileManager defaultManager];
//用这个类方法创建filemanager,因为这样创建是单例(只有一个),每个程序只需要一个文件管理器。
NSString * path = [[NSBundle mainBundle]pathForResource:@"map" ofType:@"txt"];
//查找某目录下的目录
NSError * error;
NSArray * array=[fm contentsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@",error);
}
//如果发生错误,该方法会创建一个NSError对象,将error指向NSError对象。错误的原因在description方法中。如果没错,该方法创建一堆字符串,是该目录下所有文件及子目录的名字。又创建一个数组装这些字符串,返回数组地址。contents(内容)directory(目录)
int i;
for (i=0; i<array.count; i++) {
NSLog(@"%@",[array objectAtIndex:i]);
}
//浅度遍历
//深度遍历,不仅查看指定路劲下得文件和子目录,而且查看子目录下得内容,知道没有子目录。
NSArray *array2=[fm subpathsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@",error);
}
// int i;
NSLog(@"%@",array2);
//创建文件夹
[fm createDirectoryAtPath:[NSString stringWithFormat:@"%@/Middle/dir",PATH] withIntermediateDirectories:YES attributes: nil error:&error];
if (error) {
NSLog(@"%@",error);
exit(0);
}
//第二个参数表示中间目录是否创建,如果填NO,则缺失中间目录时,报错,如果填YES,则自动创建中间目录。
//第三个参数表示文件属性,通常填nil,表示默认属性。
//创建文件
NSString * str=@"节后综合征";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
BOOL ret=[fm createFileAtPath:[NSString stringWithFormat:@"%@/file",PATH] contents:data attributes:nil]
//data 是c中的buf,用来暂时存储信息。NSLog(@“%S”,(char *)data.bytes);
//第二个参数此傲视文件内容,如果问价你创建时,不想写入内容,传nil,它的类型是NSdata
//nsdata是缓存类,用来将数据写入文件,或从文件获取数据,任何类的对象都能转成NSDATA,只不过要使用协议
//字符串转成NSDate,需要转成编码格式,UTF8是mac下得默认格式编码,对中文支持很好。
if (!ret) {
NSLog(@"文件创建失败");
exit(0);
}
//删除文件或者目录
[fm removeItemAtPath:[NSString stringWithFormat:@"%@/Middle",PATH] error:&error];
if (error) {
NSLog(@"%@",error);
exit(0);
}
//文件复制
#define PATH @"/Users/qianfeng/desktop/1314/8.4-oc文件操作/file"
#define DST_PATH @"/Users/qianfeng/desktop/1314/8.4-oc文件操作/dir/file"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSFileManager * fm = [NSFileManager defaultManager];
NSError * error=nil;
[fm copyItemAtPath:PATH toPath:DST_PATH error:&error];
if(error)
{
NSLog(@"%@",error);
exit(0);
}
//文件剪切(remove 文件删除)
[fm moveItemAtPath:PATH toPath:DST_PATH error:&error];
if(error)
{
NSLog(@"%@",error);
exit(0);
}
//获得文件属性
NSDictionary * dict = [fm attributesOfItemAtPath:PATH error:&error];
//获得当前工程下得文件路径
NSString * path = [[NSBundle mainBundle]pathForResource:@"字典" ofType:@"txt"];
2.对文件内容的操作
NSFileHandle //文件句柄
//读到句尾
NSFileHandle * fh = [NSFileHandle fileHandleForReadingAtPath:PATH];
//以只读方式打开文件,生成文件句柄。从句柄里读,就是从文件里读。
NSData * data=[fh readDataToEndOfFile];
//读到文件尾
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//data转换成string类型
NSLog(@"%@",str);
//读指定长度
NSData *data2=[fh readDataOfLength:6];
NSString *str2=[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str2);
data2=[fh readDataOfLength:6];
NSString *str3 =[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str3);
第二次读取会接着第一次后面读。
//写
[fh writeData:[@"花心大萝卜"dataUsingEncoding:NSUTF8StringEncoding]];
//从第一个字节开始覆盖。
如果要清空原文件
[fh truncateFileAtOffset:0];
//阶段至0字节。
[fh seekToEndofFile];
//将读写指针,至于文件尾
同一次打开文件,读,接着读,写,接着写!
NSFileHandle * fh = [NSFileHandle fileHandleForWritingAtPath:PATH];
//以只写方式打开文件,生成文件句柄
[fh truncateFileAtOffset:0];
//阶段至0字节。
[fh seekToEndOfFile];
//将读写指针至于文件尾。
[fh writeData:[@"花心大萝卜"dataUsingEncoding:NSUTF8StringEncoding]];
//从第一个字节开始覆盖。
[fh writeData:[@"花心大萝卜"dataUsingEncoding:NSUTF8StringEncoding]];
iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),
手动保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夹里
1、Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
2、AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
3、Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
4、tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。
获取这些目录路径的方法:
1,获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2,获取Documents目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,获取Caches目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();
5,获取应用程序程序包中资源文件路径的方法:
例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代码中的mainBundle类方法用于返回一个代表应用程序包的对象。
iphone沙盒(sandbox)中的几个目录获取方式:
[cpp] view plaincopy
- // 获取沙盒主目录路径
- NSString *homeDir = NSHomeDirectory();
- // 获取Documents目录路径
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *docDir = [paths objectAtIndex:0];
- // 获取Caches目录路径
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- NSString *cachesDir = [paths objectAtIndex:0];
- // 获取tmp目录路径
- NSString *tmpDir = NSTemporaryDirectory();
[cpp] view plaincopy
- // 获取当前程序包中一个图片资源(apple.png)路径
- NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
- UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
例子:
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){
//下面是对该文件进行制定路径的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一个目录下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
//读取某个文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
1、其中得 app root 可以用 NSHomeDirectory() 访问到;
2、Documents 目录就是我们可以用来写入并保存文件得地方,一般可通过:
1. de style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:
2. 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
3. NSArray *paths = NSSearchPa
4. thForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
5.
6. de>
7. de style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;
8. margin-top: 0px; margin-right: 0px; margin-bottom:
9. 0px; margin-left: 0px; ">NSString *documentsDirectory = [paths objectAtIndex:0];
10. de>
得到。
3、tmp 目录我们可以在里面写入一些程序运行时需要用得数据,里面写入得数据在程序退出后会没有。可以通过
1. NSString *NSTemporaryDirectory(void);
方法得到;
4、文件一些主要操作可以通过NSFileManage 来操作,可以通过 [NSFileManger defaultManger] 得到它得实例。
相关得一些操作:
创建一个目录:比如要在Documents下面创建一个test目录,
1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2. NSString *documentsDirectory = [paths objectAtIndex:0];
3. NSLog(@”%@”,documentsDirectory);
4. NSFileManager *fileManage = [NSFileManager defaultManager];
5. NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@“test”];
6. BOOL ok = [fileManage createDirectoryAtPath:myDirectory attributes:nil];
取得一个目录下得所有文件名:(如上面的myDirectory)可用
1. NSArray *file = [fileManager subpathsOfDirectoryAtPath: myDirectory error:nil];
或
1. NSArray *files = [fileManager subpathsAtPath: myDirectory ];
读取某个文件:
1. NSData *data = [fileManger contentsAtPath:myFilePath];//myFilePath
是包含完整路径的文件名
或直接用NSData 的类方法:
1. NSData *data = [NSData dataWithContentOfPath:myFilePath];
保存某个文件:
可以用 NSFileManager的
1. - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
1. - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
2. - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;
小结:详解iPhone开发中文件读写教程的内容介绍完了,希望通过本文的学习能对你有所帮助!
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
每个程序都会有它自己的沙盒,通过它你可以阅读/编写文件。写入沙盒的文件在程序的进程中将会保持稳定,即便实在程序更新的情况下。
如下所示,你可以在沙盒中定位文件目录:
1. //对于错误信息
2. NSError *error;
3. // 创建文件管理器
4. NSFileManager *fileMgr = [NSFileManagerdefaultManager];
5. //指向文件目录
6. NSString *documentsDirectory= [NSHomeDirectory()
7. stringByAppendingPathComponent:@"Documents"];
8.
9. //创建一个目录
10. [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];
创建一个文件
现在我们已经有了文件目录,我们就能使用这个路径在沙盒中创建一个新文件并编写一段代码:
1. // File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中
2. // Result is: /Documents/file1.txt结果为:/Documents/file1.txt
3. NSString *filePath= [documentsDirectory
4. stringByAppendingPathComponent:@"file1.txt"];
5. //需要写入的字符串
6. NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";
7. //写入文件
8. [str writeToFile:filePath atomically:YES
9. encoding:NSUTF8StringEncoding error:&error];
10. //显示文件目录的内容
11. NSLog(@"Documentsdirectory: %@",
12. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
我们为想要创建的文件构建一条路径(file1.txt),初始化一个字符串来写入文件,并列出目录。最后一行显示了在我们创建文件之后出现在文件目录下的一个目录列表:
对一个文件重命名
想要重命名一个文件,我们需要把文件移到一个新的路径下。下面的代码创建了我们所期望的目标文件的路径,然后请求移动文件以及在移动之后显示文件目录。
1. //通过移动该文件对文件重命名
2. NSString *filePath2= [documentsDirectory
3. stringByAppendingPathComponent:@"file2.txt"];
4. //判断是否移动
5. if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
6. NSLog(@"Unable to move file: %@", [error localizedDescription]);
7. //显示文件目录的内容
8. NSLog(@"Documentsdirectory: %@",
9. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
在移动了文件之后,输出结果应该如下图所示:
删除一个文件
为了使这个技巧完整,让我们再一起看下如何删除一个文件:
1. //在filePath2中判断是否删除这个文件
2. if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
3. NSLog(@"Unable to delete file: %@", [error localizedDescription]);
4. //显示文件目录的内容
5. NSLog(@"Documentsdirectory: %@",
6. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
一旦文件被删除了,正如你所预料的那样,文件目录就会被自动清空:
这些示例能教你的,仅仅只是文件处理上的一些皮毛。想要获得更全面、详细的讲解,你就需要掌握NSFileManager文件的知识。
在开发iPhone程序时,有时候要对文件进行一些操作。而获取某一个目录中的所有文件列表,是基本操作之一。通过下面这段代码,就可以获取一个目录内的文件及文件夹列表。
1. NSFileManager *fileManager = [NSFileManager defaultManager];
2. //在这里获取应用程序Documents文件夹里的文件及文件夹列表
3. NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
4. NSString *documentDir = [documentPaths objectAtIndex:0];
5. NSError *error = nil;
6. NSArray *fileList = [[NSArray alloc] init];
7. //fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组
8. fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];
以下这段代码则可以列出给定一个文件夹里的所有子文件夹名
1. NSMutableArray *dirArray = [[NSMutableArray alloc] init];
2. BOOL isDir = NO;
3. //在上面那段程序中获得的fileList中列出文件夹名
4. for (NSString *file in fileList) {
5. NSString *path = [documentDir stringByAppendingPathComponent:file];
6. [fileManager fileExistsAtPath:path isDirectory:(&isDir)];
7. if (isDir) {
8. [dirArray addObject:file];
9. }
10. isDir = NO;
11. }
12. NSLog(@"Every Thing in the dir:%@",fileList);
13. NSLog(@"All folders:%@",dirArray);
+ (NSString *)pathWithComponents(NSArray *)components
根据components中的元素来构建路径.
- (NSArray *)pathComponents
解析路径,返回构成路径的各个部分.
- (NSString *)lastPathComponent
提取路径中的最后一个组成部分
- (NSString *)pathExtension
从路径中最后一个组成部分中提取扩展名
- (NSString *)stringByAppendingPathComponent(NSString *)path
将path添加到现有路径末尾
- (NSString *)stringByAppendingPathExtension(NSString *)ext
将指定的扩展名添加到现有路径的最后一个组成部分上
- (NSString *)stringByDeletingLastPathComponent
删除路径中的最后一个组成部分
- (NSString *)stringByDeletingPathExtension
从文件的最后一部分删除扩展名
- (NSString *)stringByExpandingTildeInPath
将路径中的代字符扩展成用户主目录(~)或指定用户的主目录(~user)
- (NSString *)stringByResolvingSymlinksInPath
尝试解析路径中的符号链接
- (NSString *)stringByStandardizingPath
解析路径中的~,(..)父目录,(.)当前目录和符号链接来标准化路径.
常用的NSProcessInfo类(进程相关)
+ (NSProcessInfo *)processInfo
返回当前进程信息
- (NSArray *)arguments
以NSString对象数字的形式返回当前进程的参数
- (NSDictionary *)environment
返回变量/值对字典,以描述当前的环境变量(比如PATH等等)
- (int)processIdentifier
返回进程PID
- (NSString *)processName
返回当前正在执行的进程名称
- (NSString *)globallyUniqueString
每次调用该方法时,都会返回不同的单值字符串,可以生成临时文件名
- (NSString *)hostName
返回主机系统名
-(NSUInteger)operatingSystem
返回表示操作系统的数字
- (NSString *)operatingSystemName
返回操作系统的名称
- (NSString *)operatingSystemVersionString
返回操作系统版本
- (void)setProcessNameNSString *)name
修改当前进程名(谨慎使用)
基本文件操作类: NSFileHandle
NSFileHandle类没有提供创建文件的方法,所以要创建文件需要使用FileManager方法来创建, NSFileHandle类中的文件操作方法都是假定文件都是存在的,如果不存在,则返回nil.
常用的NSFileHandle方法:
+ (id)fileHandleForReadingAtPathNSString *)path
打开一个文件准备读取
+ (id)fileHandleForWritingAtPathNSString *)path
打开一个文件准备写入
+ (id)fileHandleForUpdatingAtPathNSString *)path
打开一个文件准备更新(读取和写入)
- (NSData *)availableData
从设备或者通道返回可用的数据
- (NSData *)readDataToEndOfFile
读取其余的数据直到文件的末尾(最大值为无符号整形的最大值)
- (NSData *)readDataOfLengthNSUInteger)length
从文件读取指定字节数的内容
- (void)writeDataNSData *)data
将data写入文件
- (unsigned long long)offsetInFile
获取当前文件的偏移量
- (void)seekToFileOffsetunsigned long long)offset
设置当前文件的偏移量
- (unsigned long long)seekToEndOfFile
将当前文件的偏移量定位到文件的末尾
- (void)truncateFileAtOffset:(unsigned long long)offset
将文件的长度设置为offset字节(如需要,可填充内容)
- (void)closeFile
关闭文件
-(bool) fileHandleForReadingAtPath
文件是否可读
-(void) fileHandleForWritingAtPath
文件是否可写