上一篇文章介绍了NSFileManager的一些基本用法,那么接下来就算是晋级篇——将iOS文件/文件夹可视化。
通俗地说,就是对手机中的文件进行管理,显示在tableView(列表模式)或者collectionView(大图标模式)中。
在此之前,除了必须掌握NSFileManager相关的API必须掌握,还有一个东西需要了解:
一、iOS中的沙盒机制
相关教程网上很多,不在赘述,主要介绍需要用到的几个方法:
- 获取document目录
-
刚使用苹果手机的时候,发现在手机上无法像安卓手机那样查看本地文件夹或文件。那么这次接到这个项目,需要将本机的文件展示到controller中,如何实现呢?
-
我想到的唯一的方法是:在document中创建一个文件夹,把用户需要用的文件拷贝进去,在控制器中管理这些文件即可
//获取document的路径
NSString * documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject
- 在document中创建一个文件夹,方便在里面“不羁放纵”
//在沙盒中的document目录下创建myFiles 文件夹
NSString * myFilesPath = [documentPath stringByAppendingPathComponent:@"myFiles"];
//创建文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//定义一个bool变量来记录是否为一个目录
BOOL isDir = NO;
//先判断判断一个文件目录是否存在
BOOL existed = [fileManager fileExistsAtPath:allfilesPath isDirectory:&isDir];
if (!(isDir == YES && existed == YES)) {
//如果不存在 或者无效 则自己创建
[fileManager createDirectoryAtPath: myFilesPath withIntermediateDirectories:YES attributes:nil error:nil];
}
//如果存在的话,可以在里面放入你想放的文件。
利用这个方法:
- (BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)attr;
二、文件可视化——在tableView/collectionView中展示
-
你需要准备一个控制器容纳两种视图:tableView和collectionView
当然如果你只想在列表中显示,那tableView就够用了。
两个视图都懒加载,显示一个View的时候hidden另一个。 -
数据源(关键)
一个数据源可以给两个view使用。
思路:
a. 传入参数为一个文件夹的路径(一个页面显示一个文件夹的数据)
b. 使用文件属性遍历器便利这个文件夹 跳过她的子文件夹
c. 创建model 列出需要用到的属性(一般是:name,createdTime,type,size)
d. 因为文件的type属性只能区分文件夹和常规文件,所以,我们需要根据文件的后缀名来把他们区分开来。
d. 赋值给model,部分数据根据情况进行修改,最终形成一个dataArray。
封装下来就是这样:
/**
获取数据
@param path 当前所在文件夹路径
*/
-(void)setdata:(NSString *)path {
//文件属性遍历器
NSDirectoryEnumerator *enumerator = [XHHfileManager enumeratorAtPath:path];
//如果有值,继续往下走
//创建临时可变数组
NSMutableArray <XHHFilesModel *>*tempArray = [NSMutableArray array];
//遍历属性
NSString *fileName;
while (fileName = [enumerator nextObject]) {
NSLog(@"%@",fileName);
// //跳过子路径
[enumerator skipDescendants];
// //去掉隐藏的系统文件
if ([fileName isEqualToString: @"__MACOSX"]) {
//这种东东,不显示出来最好(里面也没啥东西)
continue;
}
//这里把文件的后缀名提取出来 给model赋值
NSString *fileType;
NSLog(@"%@",enumerator.fileAttributes.fileType);
//先用系统来过滤一下文件的真实属性
//常规文件
if ([enumerator.fileAttributes.fileType isEqualToString:KRegularType]) {
//文件类型,并且统一用小写
fileType = [[fileName pathExtension] lowercaseString];
if ([fileType isEqualToString:@""]) {
fileType = @"未知";
}
}else if([enumerator.fileAttributes.fileType isEqualToString:KDirectoryType]) {
//文件夹
fileType = @"D";
}
//给model赋值
XHHFilesModel *model = [XHHFilesModel filesModelWithDict:enumerator.fileAttributes];
//kvc赋值之后自己再进行特殊的赋值
model.fileName = fileName;
model.fileType = fileType;
model.filePath = [self.path stringByAppendingPathComponent:model.fileName];
[tempArray addObject:model];
}
- 显示到tableView或者collectionView之中。
让UI换上可爱的图标,就可以很性感地展示出来啦。
下面的我想大家都会,就不用详细介绍了。
网友评论