iOS 之文件操作NSFileMange和NSFileHandle

2024-05-31 10:18

本文主要是介绍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];

参考:http://www.jianshu.com/p/d49a00200586

===============删除沙盒存储的文件

// 获取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;
}

======删除沙盒同类型的文件,如wav结尾的

#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缓存

 
#pragma mark - 获取path路径下文件夹大小 + (NSString *)getCacheSizeWithFilePath:(NSString *)path{ // 获取“path”文件夹下的所有文件 NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path]; NSString *filePath = nil; NSInteger totleSize = 0; for (NSString *subPath in subPathArr){ // 1. 拼接每一个文件的全路径 filePath =[path stringByAppendingPathComponent:subPath]; // 2. 是否是文件夹,默认不是 BOOL isDirectory = NO; // 3. 判断文件是否存在 BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory]; // 4. 以上判断目的是忽略不需要计算的文件 if (!isExist || isDirectory || [filePath containsString:@".DS"]){ // 过滤: 1. 文件夹不存在 2. 过滤文件夹 3. 隐藏文件 continue; } // 5. 指定路径,获取这个路径的属性 NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; /** attributesOfItemAtPath: 文件夹路径 该方法只能获取文件的属性, 无法获取文件夹属性, 所以也是需要遍历文件夹的每一个文件的原因 */ // 6. 获取每一个文件的大小 NSInteger size = [dict[@"NSFileSize"] integerValue]; // 7. 计算总大小 totleSize += size; } //8. 将文件夹大小转换为 M/KB/B NSString *totleStr = nil; if (totleSize > 1000 * 1000){ totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f]; }else if (totleSize > 1000){ totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ]; }else{ totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f]; } return totleStr; } #pragma mark - 清除path文件夹下缓存大小 + (BOOL)clearCacheWithFilePath:(NSString *)path{ //拿到path路径的下一级目录的子文件夹 NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; NSString *filePath = nil; NSError *error = nil; for (NSString *subPath in subPathArr) { filePath = [path stringByAppendingPathComponent:subPath]; //删除子文件夹 [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error]; if (error) { return NO; } } return YES; }

===========清除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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017740

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常