iOS中对文件的操作

转自:http://marshal.easymorse.com/archives/3340

iOS中对文件的操作

因为应用是在沙箱(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 *[email protected]"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 *[email protected]"更深夜静人已息"; 
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);

代码运行效果:

iOS文件系统的管理

NSFileManager

判断一个给定路劲是否为文件夹

[self.fileManagerfileExistsAtPath:isDirectory:];

用于执行一般的文件系统操作 (reading and writing is done via NSData, et. al.).
主要功能包括:从一个文件中读取数据;向一个文件中写入数据;删除文件;复制文件;移动文件;比较两个文件的内容;测试文件的存在性;读取/更改文件的属性... ... 
Just alloc/init an instance and start performing operations. Thread safe.

  • 常见的NSFileManager处理文件的方法如下:
NSFileManager *fileManager = [[NSFileManager alloc]init]; //最好不要用defaultManager。 
NSData *myData = [fileManager contentsAtPath:path]; // 从一个文件中读取数据 
[fileManager createFileAtPath:path contents:myData attributes:dict];//向一个文件中写入数据,属性字典允许你制定要创建 
[fileManager removeItemAtPath:path error:err]; 
[fileManager moveItemAtPath:path toPath:path2 error:err]; 
[fileManager copyItemAtPath:path toPath:path2 error:err]; 
[fileManager contentsEqualAtPath:path andPath:path2]; 
[fileManager fileExistsAtPath:path]; ... ...
  • 常见的NSFileManager处理目录的方法如下:
[fileManager currentDirectoryPath]; 
[fileManager changeCurrentDirectoryPath:path]; 
[fileManager copyItemAtPath:path toPath:path2 error:err]; 
[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:err]; 
[fileManager fileExistsAtPath:path isDirectory:YES]; 
[fileManager enumeratorAtPath:path]; //获取目录的内容列表。一次可以枚举指定目录中的每个文件。 ... ...

Has a delegate with lots of “should” methods (to do an operation or proceed after an error).
And plenty more. Check out the documentation.

1、文件的创建


-(IBAction) CreateFile

{

//对于错误信息

NSError *error;

// 创建文件管理器

NSFileManager *fileMgr = [NSFileManager defaultManager];

//指向文件目录

NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

//创建一个目录

[[NSFileManager defaultManager]   createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];

// File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中

// Result is: /Documents/file1.txt结果为:/Documents/file1.txt

NSString *filePath= [documentsDirectory

stringByAppendingPathComponent:@"file2.txt"];

//需要写入的字符串

NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";

//写入文件

[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

//显示文件目录的内容

NSLog(@"Documentsdirectory: %@",[fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);
}

 

2、对文件重命名

对一个文件重命名
想要重命名一个文件,我们需要把文件移到一个新的路径下。下面的代码创建了我们所期望的目标文件的路径,然后请求移动文件以及在移动之后显示文件目录。
//通过移动该文件对文件重命名
NSString *filePath2= [documentsDirectory
stringByAppendingPathComponent:@"file2.txt"];
//判断是否移动
if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
NSLog(@"Unable to move file: %@", [error localizedDescription]);
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@",
[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
 

3、删除一个文件


为了使这个技巧完整,让我们再一起看下如何删除一个文件:
//在filePath2中判断是否删除这个文件
if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
NSLog(@"Unable to delete file: %@", [error localizedDescription]);
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@",
[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
一旦文件被删除了,正如你所预料的那样,文件目录就会被自动清空:

这些示例能教你的,仅仅只是文件处理上的一些皮毛。想要获得更全面、详细的讲解,你就需要掌握NSFileManager文件的知识。

 

4、删除目录下所有文件


//获取文件路径
- (NSString *)attchmentFolder{

NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *path = [document stringByAppendingPathComponent:@"Attchments"];

NSFileManager *manager = [NSFileManager defaultManager];

if(![manager contentsOfDirectoryAtPath:path error:nil]){

[manager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];

}
return path;

}

--清除附件
BOOL result = [[NSFileManager defaultManager] removeItemAtPath:[[MOPAppDelegate instance] attchmentFolder] error:nil];

5、判断文件是否存在

NSString *filePath = [self dataFilePath];

if ([[NSFileManager defaultManager]fileExistsAtPath:filePath])

//do some thing

附:

-(NSString *)dataFilePath

{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentDirectory = [paths objectAtIndex:0];

return [documentDirectory stringByAppendingPathComponent:@"data.plist"];

}

常用路径工具函数

NSString * NSUserName(); 返回当前用户的登录名

NSString * NSFullUserName(); 返回当前用户的完整用户名

NSString * NSHomeDirectory(); 返回当前用户主目录的路径

NSString * NSHomeDirectoryForUser(); 返回用户user的主目录

NSString * NSTemporaryDirectory(); 返回可用于创建临时文件的路径目录

常用路径工具方法

-(NSString *) pathWithComponents:components    根据components(NSArray对象)中元素构造有效路径

-(NSArray *)pathComponents                                          析构路径,获取路径的各个部分

-(NSString *)lastPathComponent                                       提取路径的最后一个组成部分

-(NSString *)pathExtension                                           路径扩展名

-(NSString *)stringByAppendingPathComponent:path                    将path添加到现有路径末尾

-(NSString *)stringByAppendingPathExtension:ext           将拓展名添加的路径最后一个组成部分

-(NSString *)stringByDeletingPathComponent                           删除路径的最后一个部分

-(NSString *)stringByDeletingPathExtension                           删除路径的最后一个部分 的扩展名

-(NSString *)stringByExpandingTildeInPath          将路径中的代字符扩展成用户主目录(~)或指定用户主目录(~user)

-(NSString *)stringByResolvingSymlinksInPath                         尝试解析路径中的符号链接

-(NSString *)stringByStandardizingPath            通过尝试解析~、..、.、和符号链接来标准化路径

-

使用路径NSPathUtilities.h 

tempdir = NSTemporaryDirectory(); 临时文件的目录名

path = [fm currentDirectoryPath];

[path lastPathComponent]; 从路径中提取最后一个文件名

fullpath = [path stringByAppendingPathComponent:fname];将文件名附加到路劲的末尾

extenson = [fullpath pathExtension]; 路径名的文件扩展名

homedir = NSHomeDirectory();用户的主目录

component = [homedir pathComponents];  路径的每个部分

NSProcessInfo类:允许你设置或检索正在运行的应用程序的各种类型信息

(NSProcessInfo *)processInfo                                  返回当前进程的信息

-(NSArray*)arguments                                           以NSString对象数字的形式返回当前进程的参数

-(NSDictionary *)environment                                   返回变量/值对词典。描述当前的环境变量

-(int)processIdentity                                          返回进程标识

-(NSString *)processName                                       返回进程名称

-(NSString *)globallyUniqueString   每次调用该方法都会返回不同的单值字符串,可以用这个字符串生成单值临时文件名

-(NSString *)hostname                                          返回主机系统的名称

-(unsigned int)operatingSystem                                 返回表示操作系统的数字

-(NSString *)operatingSystemName                                     返回操作系统名称

-(NSString *)operatingSystemVersionString                                     返回操作系统当前版本

-(void)setProcessName:(NSString *)name                                将当前进程名称设置为name

============================================================================
 NSFileHandle类允许更有效地使用文件。
可以实现如下功能
1、打开一个文件,执行读、写或更新(读写)操作;
2、在文件中查找指定位置;
3、从文件中读取特定数目的字节,或将特定数目的字节写入文件中
另外,NSFileHandle类提供的方法也可以用于各种设备或套接字。一般而言,我们处理文件时都要经历以下三个步骤
1、打开文件,获取一个NSFileHandle对象(以便在后面的I/O操作中引用该文件)。
2、对打开文件执行I/O操作。
3、关闭文件。

NSFileHandle *fileHandle = [[NSFileHandle alloc]init]; 
fileHandle = [NSFileHandle fileHandleForReadingAtPath:path]; //打开一个文件准备读取
fileHandle = [NSFileHandle fileHandleForWritingAtPath:path]; 
fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:path]; 
fileData = [fileHandle availableData]; // 从设备或者通道返回可用的数据 
fileData = [fileHandle readDataToEndOfFile]; 
[fileHandle writeData:fileData]; //将NSData数据写入文件 
[fileHandle closeFile]; //关闭文件 ... ...

注:NSFileHandle类没有提供创建文件的功能,所以必须使用NSFileManager来创建文件

时间: 2024-10-14 08:12:31

iOS中对文件的操作的相关文章

iOS中NSFileManager文件常用操作整合

//获取Document路径 + (NSString *)getDocumentPath { NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [filePaths objectAtIndex:0]; } //获取Library路径 + (NSString *)getLibraryPath { NSArray *filePaths

python中关于文件的操作

今天让我们来一起学习一下python中关于文件的操作吧: 先看看以下如果打开文件: #open()打开文件的方法:r参数只能以读的方式打开文件,不能写 =(,,=)data=.read()(data)

Android中的文件权限操作

默认本工程创建的文件本工程对其有读写权限. 我们可以通过context.openFileOutput("文件名", 模式): 我们可以创建私有, 共有, 只读, 只写文件, 默认的文私有文件. 如果别的Android工程访问本工程的文件的话就会受限制, android的内核是linux, 所以他的文件管理和linux中的文件时一样的. 创建文件代码: /** * 创建各种文件 * @throws IOException * */ @SuppressLint({ "WorldW

iOS开发 plist文件的操作

iOS开发 plist文件操作 浏览:6287 | 更新:2015-02-05 19:57 1 2 3 4 5 分步阅读 iOS开发常用数据存储方式有:NSKeyedArchiver.NSUserDefaults.Write写入方式.SQLite.为了简洁明了的存储和可视化展现数据,以文件形式存储数据是很有必要的.plist文件在iOS开发中属于Write写入方式,可以以Property List列表形式显示,也可以以xml格式显示.对于数据管理是很方便的.掌握使用plist文件数据操作很有必要

linux下拷贝命令中的文件过滤操作记录

在日常的运维工作中,经常会涉及到在拷贝某个目录时要排查其中的某些文件.废话不多说,下面对这一需求的操作做一记录: linux系统中,假设要想将目录A中的文件复制到目录B中,并且复制时过滤掉源目录A中的文件a和b做法如下:#cd A#cp -r `ls |grep -v a |grep -v b| xargs` B注意:1)上面在cp命令执行前,最好提前cd切换到源目录A下,不然就要在ls后跟全路径,否则就会报错.2)命中中的xargs参数加不加效果都一样,不过最好是加上,表示前面的命令输出3)g

【python学习笔记】pthon3.x中的文件读写操作

在学习python文件读写的时候,因为教程是针对python2的,而使用的是python3.想要利用file类时,类库里找不到,重装了python2还是使不了.在别人园子认真拜读了<详解python2和python3区别>(已收藏)之后,才发现python3已经去掉file类. 现在利用python进行文件读写的方法更加类似于C语言的文件读写操作. 如今总结如下: 一 打开文件—— f = open('poem.txt','x+'): 读过open的帮助文档,然后自己翻译了一下,现给大家分享一

oc中对文件的操作(加载已有文件数据,存取文件)

----------------------------File.h------------------------------- #import <Foundation/Foundation.h>   @interface FileHelper : NSObject +(NSMutableArray *)loadData;//加载数据并保存在数组中 +(void)saveStudentData:(NSMutableArray *)dataArr;//保存数据在数组中 +(NSMutableA

Windows系统中监控文件复制操作的几种方式

http://blog.sina.com.cn/s/blog_4596beaa0100lp4y.html 1. ICopyHook 作用: 监视文件夹和打印机移动,删除, 重命名, 复制操作. 可以得到源和目标文件名. 可以控制拒绝操作. 缺点: 不能对文件进行控制. 只对Shell文件操作有效, 对原生Api MoveFile, CopyFile之类的操作无效. 用法: 从ICopyHook派生一个COM对象, 重载CopyCallbackA和CopyCallbackW, 然后把COM注册到H

安卓系统中的文件读写操作

权限 <manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest> WRITE_EXTERNAL_STORAGE 已经隐含了读取权限 得到当前应用下的路径文件 File file = new File(context.getFilesDir(), filename); 写文件 String file