OC语言基础十:OC文件操作

本文详细介绍如何使用Swift语言通过NSFileManager和NSFileHandle类进行文件和目录的创建、遍历、移动、复制、删除等操作,以及如何查看文件属性和判断文件是否存在。同时,介绍了如何打开、读取、写入、同步和关闭文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要的类

NSFileManager:文件管理类,当我们要去创建目录,或者操作目录中某些文件的时候,或者想查看某个目录或者文件的属性。
NSFileHandle:如果操作对象是某个文件,并在里面进行文本的编辑。

NSFileManager

创建文件管理类单例对象:

NSFileManager *fileManger=[NSFileManager defaultManager];

创建目录

:第一个参数:文件夹目录
第二个参数:是否附带中间路径,也就是在目录之前可能生成一些中间目录出来,YES附带,NO不附带,如果要在第一个参数目录后面连续添加目录,则必须为YES.比如:/Users/chao/Desktop/FileOperation/Test/Test1
第三个参数:目录属性,一般用系统默认提供给我们的,一般传nil
第四个参数:如果目录创建失败,返回为什么创建失败了,以便于我们去完成一些异常操作。是一个二级指针。
返回是一个BOOL值,也能帮助我们判断路径是创建成功了还是失败了。

将文件夹拖动到xcode界面,会在文档里自动生成该文件夹的路径。

NSError *error=nil;
BOOL ret=[fileManager createDirectoryAtPath:@"/Users/chao/Desktop/FileOperation/Test" withIntermediateDirectories:NO attributes:nil error:&error];
if(ret){
 NSLog(@"目录创建成功");
}else{
   NSLog(@"目录创建失败,reason:%@",error);
}
定义带参宏

为了后续操作路径方便,对多次使用的同一个路径,可以写在一个宏定义当中。首先确定变量是什么,不变的量是什么。父路径是不变的,可变的是子路径,到底是创建目录呢,还是创建文件。

使用的时候,用到字符串拼接,或者格式化字符串的方法。

 #import <Foundation/Foundation.h>
 #define kPathAtFileOperation(subpath) \
 [NSString stringWithFormat:@"/Users/chao/Desktop/FileOperation/%@",subpatch]

//main
NSError *error=nil;
BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test") withIntermediateDirectories:NO attributes:nil error:&error];
if(ret){
 NSLog(@"目录创建成功");
}else{
   NSLog(@"目录创建失败,reason:%@",error);
}
附带中间路径

test1和test1-1之前都没有生成过,此时第二个参数要写成YES,如果写成NO的话,程序不会识别中间的test1。

BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test1/test1-1") withIntermediateDirectories:YES attributes:nil error:&error];

创建文件

文件路径肯定是带 .文件类型 的。
contents参数接的是文件的内容,NSData类型,如果传nil,那么文件内容就是空的。

当多次创建相同的文件时,会进行覆盖操作。

NSString *string=@"文件操作";
NSData *data=[string dataUsingEncoding:NSUTF8StringEncoding];
ret=[fileManager createFileAtPath:kPathAtFileOperation(@"test.txt")  contents:data  attributes:nil];

路径遍历

浅度遍历

第一个参数:要遍历的路径。返回结果是NSArray类型的,会把目录下的所有内容全部列举出来。隐藏文件一般都是.开头的

NSArray *contents=[fileManager  contentsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];

结果:
“.DS_Store”,
test,
“test.txt”,
test1

深度遍历
contents=[fileManager  subpathsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];

结果:
“.DS_Store”,
test,
“test.txt”,
test1,
“test1/.DS_Store”,
“test1/test1-1”
浅度遍历的结果,在深度遍历里都可以找到。文件结构中所有的节点都会扫描一遍。所以浅度效率要高一些,深度遍历在路径复杂的时候,耗时会久一些。

文件移动

[fileManager moveItemAtPath:kPathAtFileOperation(@"test.txt")  toPath:kPathAtFileOperation(@"test/test.txt")  error:nil];

复制操作

[fileManager copyItemAtPath:kPathAtFileOperation(@"test/test.txt")  toPath:@"/Users/chao/Desktop/FileOperation"  error:nil];

删除操作

[fileManager removeItemAtPath:kPathAtFileOperation(@"test.txt")  error:nil];

查看属性

返回结果是字典NSDictionary类

NSDictionary *dictionary=[fileManager attributesOfItemAtPath:kPathAtFileOperation(@"test/test.txt") error:nil];

查看文件是否在路径下存在

if(fileManager  fileExistsAtPath:kPathAtFileOperation(@"test/test.txt")){
 NSLog(@"YES");
}else{
  NSLog(@"NO");
}

NSFileHandle

打开文件

只读,不可写:

NSFileHandle *  = [NSFileHandle fileHandleForReadingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"]; NSLog(@"%@",[fileHandle  readDataToEndOffFile]);//从光标的位置读到文件末尾,如果不去操作光标位置,那么光标默认是在文件的最前面。读出的是二进制数据,要转换一下才能看到有意义的字符串

只写,不可读:

NSFileHandle *  = [NSFileHandle fileHandleForWritingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"]; 

可读,可写:

NSFileHandle *  = [NSFileHandle fileHandleForUpdatingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"]; 

读取文件

NSLog(@"%@",[fileHandle  readDataToEndOffFile]);
NSLog(@"%@",[fileHandle  readDataToEndOffFile]);

第二次输出为空,因为每次去调取读取文件相关方法的时候,都会导致光标的移动。

读取指定长度的数据:

[fileHandle  readDataOfLength:1];

写入数据

写入的是NSData数据。
string的dataUsingEncoding方法,字符串转NSData

NSString *string=@"baidu.com";
[fileHandle  writeData:[string dataUsingEncoding:NSUTF8StringEncoding]];
文件数据的同步

在进行了文件数据的修改后,可以手动调用synchronizeFile方法,来完成数据的同步,这是很常用的。

[fileHandle  synchronizeFile];
光标移动

offset是光标的偏移量,当offset为0,光标就会设置到文件开头。

[fileHandle seekToFileOffset:0];

关闭文件

每次打开文件,操作完成后,必须关闭文件。关闭之后就不能继续进行操作了。

[NSFileHandle  closeFile];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值