本文主要是介绍iOS 之文件操作NSFileMange和NSFileHandle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、NSFileManager 文件/文件夹 的操作
NSFileManager 用于对文件或目录(文件夹)管理的单例类。
文件管理类的实例化方法 例如:
NSFileManager *fm=[NSFileManager defaultManager];
fileExistsAtPath 用于判断文件是否存在 例如:
BOOL ret=[fm fileExistsAtPath:@"/Users/kingkong/Desktop/Test/test.txt"];
createFileAtPath 用于创建文件 第一个参数是文件名,第二个参数是文件的初始值,第三个参数是文件的属性 例如:
BOOL ret=[fm createFileAtPath:@"/Users/kingkong/Desktop/Test/test.txt" contents:nil attributes:nil];
copyItemAtPath 用于复制文件:将某一个文件复制成另一个文件,第三个参数:回调错误信息 例如:
NSError *error=nil;//用于接收错误信息
NSString *curpath=@"/Users/kingkong/Desktop/Test/test.txt”;
NSString *topath=@"/Users/kingkong/Desktop/Test/test2.txt”;
ret=[fm copyItemAtPath: curpath toPath: topath error:&error];
if(error!=nil){
NSLog(@"error:%@",[error userInfo]);
}
moveItemAtPath 用于移动/重命名文件;将某个路径下的文件移动到另一个路径下的文件(目标路径一定要指定文件名),
如果源路径与目 标路径下的文件名不同,同时重命名 例如:
NSString *curpath=@"/Users/kingkong/Desktop/Test/test.txt”;
NSString *topath=@"/Users/kingkong/Desktop/Test/test2.txt”;
[fm moveItemAtPath: curpath toPath: topath error:nil];
attributesOfItemAtPath 获取文件的属性 例如:
NSString *curpath=@"/Users/kingkong/Desktop/Test/test.txt";
NSDictionary *dict= [fm attributesOfItemAtPath: curpath error:nil];
//获取属性字典中该文件的大小
NSLog(@"size:%@",[dict objectForKey:NSFileSize]);
removeItemAtPath 用于删除指定路径下的文件 例如:
NSString *path=@"/Users/kingkong/Desktop/Test/test.txt”;
BOOL ret=[fm removeItemAtPath: path error:nil];
NSData:当对文件操作(写数据到文件和从文件中读数据)和从网络上获取数据,需要将数据转换为纯粹的二进制形式,
NSData就是二进制形式的缓存对象,相当于C中的char buf[255] 例如:
NSString *path=@"/Users/kingkong/Desktop/Test/test.txt”;
NSData *content=[fm contentsAtPath: path];
NSData数据转换为NSString类型数据 例如:
//NSData---->NSString,将NSData对象转换为字符串
NSString *scontent=[[NSString alloc]initWithData:content encoding:NSUTF8StringEncoding];
NSString类型的数据转换为NSData数据 例如:
NSString *str=@"hello China!";
//NSString---->NSData;将字符串转换为NSData数据(写入文件或传输到网络上)
NSData *data2=[strdataUsingEncoding:NSUTF8StringEncoding];
createFileAtPath … contents 建文件并指定写入内容 例如:
NSString *path=@"/Users/kingkong/Desktop/Test/test.txt”;
[fm createFileAtPath:path contents:data2 attributes:nil];
fileExistsAtPath… isDirectory 判断目录是否存在(在文件/目录存在的情况下,通过第二个参数获取是否是目录/文件) 例如:
BOOL isDir;//可能结果有:-1,0,1
NSString *path=@"/Users/kingkong/Desktop/Test/test.txt”;
BOOL ret=[fm fileExistsAtPath:path isDirectory:&isDir];
contentsOfDirectoryAtPath 浅遍历:获取目录下的子目录和文件名 例如:
NSString *path=@"/Users/kingkong/Desktop/Test”;
NSArray *array=[fm contentsOfDirectoryAtPath: path error:nil];
NSLog(@"array%@",array);
subpathsAtPath 深遍历:获取目录下所有的内容(包括子目录下的所有的内容) 例如:
NSString *path=@"/Users/kingkong/Desktop/Test”;
NSArray *array2=[fm subpathsAtPath:path];
NSLog(@"array2:%@",array2);
currentDirectoryPath 获取当前应用程序所在目录 例如:
1NSString* currentPath=[fm currentDirectoryPath];
NSLog(@"%@",currentPath);
createDirectoryAtPath… withIntermediateDirectories 创建目录,第一个参数是目录名,第二个参数是
当目录不存在时是否需要创建其上一级不存在的目录(中间目录)
NSString *path=@"/Users/kingkong/Desktop/Test/File”;
BOOL ret=[fm createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
参考:https://www.cnblogs.com/ChinaKingKong/p/4639431.html
二.**********NSFileHandle
常用处理方法
+ (id)fileHandleForReadingAtPath:(NSString *)path 打开一个文件准备读取
+ (id)fileHandleForWritingAtPath:(NSString *)path 打开一个文件准备写入
+ (id)fileHandleForUpdatingAtPath:(NSString *)path 打开一个文件准备更新
- (NSData *)availableData; 从设备或通道返回可用的数据
- (NSData *)readDataToEndOfFile; 从当前的节点读取到文件的末尾
- (NSData *)readDataOfLength:(NSUInteger)length; 从当前节点开始读取指定的长度数据
- (void)writeData:(NSData *)data; 写入数据
- (unsigned long long)offsetInFile; 获取当前文件的偏移量
- (void)seekToFileOffset:(unsigned long long)offset; 跳到指定文件的偏移量
- (unsigned long long)seekToEndOfFile; 跳到文件末尾
- (void)truncateFileAtOffset:(unsigned long long)offset; 将文件的长度设为offset字节
- (void)closeFile; 关闭文件
向文件追加数据
NSString *homePath = NSHomeDirectory( );
NSString *sourcePath = [homePath stringByAppendingPathConmpone:@"testfile.text"];
NSFileHandle *fielHandle = [NSFileHandle fileHandleForUpdatingAtPath:sourcePath];
[fileHandle seekToEndOfFile]; 将节点跳到文件的末尾
NSString *str = @"追加的数据"
NSData* stringData = [str dataUsingEncoding:NSUTF8StringEncoding];
[fileHandle writeData:stringData]; 追加写入数据
[fileHandle closeFile];
定位数据
NSFileManager *fm = [NSFileManager defaultManager];
NSString *content = @"abcdef";
[fm createFileAtPath:path contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSUInteger length = [fileHandle availabelData] length]; 获取数据长度
[fileHandle seekToFileOffset;length/2]; 偏移量文件的一半
NSData *data = [fileHandle readDataToEndOfFile];
[fileHandle closeFile];
复制文件
NSFileHandle *infile, *outfile; 输入文件、输出文件
NSData *buffer; 读取的缓冲数据
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *homePath = NSHomeDirectory( );
NSString *sourcePath = [homePath stringByAppendingPathComponent:@"testfile.txt"]; 源文件路径
NSString *outPath = [homePath stringByAppendingPathComponent:@"outfile.txt"]; 输出文件路径
BOOL sucess = [fileManager createFileAtPath:outPath contents:nil attributes:nil];
if (!success)
{
return N0;
}
infile = [NSFileHandle fileHandleForReadingAtPath:sourcePath]; 创建读取源路径文件
if (infile == nil)
{
return NO;
}
outfile = [NSFileHandle fileHandleForReadingAtPath:outPath]; 创建并打开要输出的文件
if (outfile == nil)
{
return NO;
}
[outfile truncateFileAtOffset:0]; 将输出文件的长度设为0
buffer = [infile readDataToEndOfFile]; 读取数据
[outfile writeData:buffer]; 写入输入
[infile closeFile]; 关闭写入、输入文件
[outfile closeFile];
===============删除沙盒存储的文件
// 获取Library文件夹路径
NSString *libPath =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
// 获取Library下Caches文件夹路径
NSString *cachePath = [libPathstringByAppendingPathComponent:@"Caches"];
// 实例化NSFileManager
NSFileManager *fileManager = [NSFileManagerdefaultManager];
// 获取Caches文件夹下的所有文件及文件夹
NSArray *array = [fileManagercontentsOfDirectoryAtPath:cachePatherror:nil];
// 循环删除Caches下的所有文件及文件夹
for (NSString *fileName in array) {
[fileManager removeItemAtPath:[cachePath stringByAppendingPathComponent:fileName] error:nil];
}
=================#pragma mark - 获取沙盒Document的文件目录 + (NSString *)getDocumentDirectory{return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; }#pragma mark - 获取沙盒Library的文件目录 + (NSString *)getLibraryDirectory{return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; }#pragma mark - 获取沙盒Library/Caches的文件目录 + (NSString *)getCachesDirectory{return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; }#pragma mark - 获取沙盒Preference的文件目录 + (NSString *)getPreferencePanesDirectory{return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject]; }#pragma mark - 获取沙盒tmp的文件目录 + (NSString *)getTmpDirectory{returnNSTemporaryDirectory(); }
#pragma mark - 根据路径返回目录或文件的大小 + (double)sizeWithFilePath:(NSString *)path{// 1.获得文件夹管理者NSFileManager *manger = [NSFileManager defaultManager];// 2.检测路径的合理性BOOL dir = NO;BOOL exits = [manger fileExistsAtPath:path isDirectory:&dir];if (!exits) return 0;// 3.判断是否为文件夹if (dir) { // 文件夹, 遍历文件夹里面的所有文件// 这个方法能获得这个文件夹下面的所有子路径(直接\间接子路径)NSArray *subpaths = [manger subpathsAtPath:path];int totalSize = 0;for (NSString *subpath in subpaths) {NSString *fullsubpath = [path stringByAppendingPathComponent:subpath];BOOL dir = NO;[manger fileExistsAtPath:fullsubpath isDirectory:&dir];if (!dir) { // 子路径是个文件NSDictionary *attrs = [manger attributesOfItemAtPath:fullsubpath error:nil];totalSize += [attrs[NSFileSize] intValue];}}return totalSize / (1024 * 1024.0);} else { // 文件NSDictionary *attrs = [manger attributesOfItemAtPath:path error:nil];return [attrs[NSFileSize] intValue] / (1024.0 * 1024.0);} }#pragma mark - 得到指定目录下的所有文件 + (NSArray *)getAllFileNames:(NSString *)dirPath{NSArray *files = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:dirPath error:nil];return files; }#pragma mark - 删除指定目录或文件 + (BOOL)clearCachesWithFilePath:(NSString *)path{NSFileManager *mgr = [NSFileManager defaultManager];return [mgr removeItemAtPath:path error:nil]; }#pragma mark - 清空指定目录下文件 + (BOOL)clearCachesFromDirectoryPath:(NSString *)dirPath{//获得全部文件数组NSArray *fileAry = [JRCleanCaches getAllFileNames:dirPath];//遍历数组BOOL flag = NO;for (NSString *fileName in fileAry) {NSString *filePath = [dirPath stringByAppendingPathComponent:fileName];flag = [JRCleanCaches clearCachesWithFilePath:filePath];if (!flag)break;}return flag; }
#define kDocument_Folder [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]
NSFileManager *fileManager = [NSFileManagerdefaultManager];
NSArray *fileListArray = [fileManagercontentsOfDirectoryAtPath:kDocument_Foldererror:nil];
for (NSString *file in fileListArray)
{
NSString *path = [kDocument_Folder stringByAppendingPathComponent:file];
NSString *extension = [path pathExtension];
if (([extension compare:@"wav" options:NSCaseInsensitiveSearch] == NSOrderedSame) || ([extension compare:@"amr" options:NSCaseInsensitiveSearch] == NSOrderedSame))
{
[fileManager removeItemAtPath:path error:nil];
}
============清除cache缓存
===========清除preference
//添加preference
[[NSUserDefaults standardUserDefaults] setObject:@"value1" forKey:@"key1"];
[[NSUserDefaults standardUserDefaults] synchronize];
//删除preference单个字段
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"key1 "];
[[NSUserDefaults standardUserDefaults] synchronize];
//删除所有preference字段
NSString *appDomainStr = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomainStr];
这篇关于iOS 之文件操作NSFileMange和NSFileHandle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!