OC学习--文件操作

本文详细介绍了Objective-C中的文件操作,包括文件本省的操作和文件内容的操作,并通过实例展示了如何使用NSFileManager和NSFileHandle类进行文件的创建、删除、移动、拷贝、读取、写入等操作。此外,还提供了一个程序示例,用于将目录下的文件进行分类管理。

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

OC中文件的操作可以分为两类:


(1)文件本省的操作:创建、删除、移动、拷贝等

(2)文件内容的操作:读、写等


|| 读:   磁盘——>内存

|| 写:内存——>磁盘


要想学会OC中的文件操作,我们就要学会两个类:


NSFileManager(文件管理类)

NSFileHandle(文件句柄类)


一、NSFileManager

1、创建文件管理器单利对象

NSFileManager *fm = [NSFileManagerdefaultManager];


2、遍历目录下内容

//浅度遍历指定目录

NSError * __autoreleasing error =nil;

NSArray *ary = [fmcontentsOfDirectoryAtPath:@"PATH"error:&error];

//该方法若出错会创建一个NSError类型的对象,然后用传递过来的error指针指向该对象

if (error) {

NSLog(@"%@", error);

}

//深度遍历指定目录

NSArray *ary2 = [fmsubpathsOfDirectoryAtPath:PATHerror:nil];

NSArray *ary2 = [fm subpathsAtPath:PATH];


3、创建文件或者目录


//创建文件,若创建的文件已存在,则会覆盖

BOOL ret = [fm createFileAtPath:PATHcontents:nilattributes:nil];

//创建文件夹,若文件夹已经存在,则不会覆盖

/*

参数1:创建的目录

参数2:是否创建中间目录

参数3:要创建的目录的属性

参数4:出错处理

*/

ret = [fm createDirectoryAtPath:PATH2withIntermediateDirectories:YESattributes:nilerror:nil];

if (ret == YES) {

NSLog(@"目录创建成功");

} else {

NSLog(@"目录创建失败");

}



4、拷贝文件或者目录


//拷贝文件或目录

BOOL ret = [fm copyItemAtPath:SRCtoPath:DSTerror:nil];

if (ret == YES) {

NSLog(@"拷贝成功");

} else {

NSLog(@"拷贝失败");

}



5、移动文件或者目录


BOOL ret = [fm moveItemAtPath:SRCtoPath:DSTerror:nil];

if (ret == YES) {

NSLog(@"移动成功");

} else {

NSLog(@"移动失败");

}


6.删除文件或者目录

BOOL ret = [fm removeItemAtPath:PATHerror:nil];


7、获取文件属性

NSDictionary *attr = [fmattributesOfItemAtPath:PATH2error:nil];


8、判断文件是否存在

ret = [fm fileExistsAtPath:PATH2];


9、判断文件是否存在,是否是目录

BOOL isDir = NO;

ret = [fm fileExistsAtPath:PATH2isDirectory:&isDir];


二、NSFileHandle


1、打开文件方式(默认位置在文件的开头)

//已只读方式打开文件

NSFileHandle *fh = [NSFileHandlefileHandleForReadingAtPath:PATH];

//以只写方式打开文件

NSFileHandle *fh2 = [NSFileHandlefileHandleForWritingAtPath:PATH];

//以读写方式打开

NSFileHandle *fh3 = [NSFileHandlefileHandleForUpdatingAtPath:PATH];


2、从当前偏移量读到文件尾

NSData *data = [fhreadDataToEndOfFile];


3、读取制定长度的数据(单位是字节)

NSData *data = [fh readDataOfLength:5];


4、设置文件的偏移量(单位字节)

[fh seekToFileOffset:10];


5、设置文件偏移量之文件尾

[fh seekToEndOfFile];

6、将文件的长度设置为offset大小(截断文件)

[fh3 truncateFileAtOffset:20];


7、将数据写入到文件

[fh2 writeData:data];


练习题、:


编写一个程序,将一个目录下的文件分类管理

a、用每个文件的后缀创建对应全大写目录,将同类文件移动到对应的目录。

如:1.txt文件,创建TXT目录,将1.txt移动到该目录

b、将没有后缀的文件移动到Others目录

c、将目录移动到subDir目录中


#import "JYFileManager.h"


@implementation JYFileManager

{

   NSMutableArray *_contents;

   NSString *_path;

}


- (instancetype)initWithPath:(NSString *)path

{

   if (self = [superinit]) {

       _path = path;

       _contents = [[NSMutableArrayalloc] init];

    }

    return self;

}


- (void)moveDirectory:(NSString *)name

{

    NSFileManager *fm = [NSFileManagerdefaultManager];

    

    //1、创建subDir目录

    NSString *subDir = [_pathstringByAppendingPathComponent:@"subDir"];

    [fm createDirectoryAtPath:subDirwithIntermediateDirectories:YESattributes:nilerror:nil];

    

    //2、拼接原路径和目标路径

    NSString *src = [_pathstringByAppendingPathComponent:name];

    NSString *dst = [subDirstringByAppendingPathComponent:name];

    [fm moveItemAtPath:srctoPath:dst error:nil];

}


- (void)moveFile:(NSString *)name

{

    NSArray *ary = [namecomponentsSeparatedByString:@"."];

    NSFileManager *fm = [NSFileManagerdefaultManager];

    

   if (ary.count ==1) {

       //没有后缀

        NSString *others = [_pathstringByAppendingPathComponent:@"Others"];

        [fm createDirectoryAtPath:otherswithIntermediateDirectories:YESattributes:nilerror:nil];

        NSString *src = [_pathstringByAppendingPathComponent:name];

       NSString *dst = [others stringByAppendingPathComponent:name];

        [fmmoveItemAtPath:src toPath:dst error:nil];

    }else {

       //有后缀

       NSString *dir = [[ary lastObject] uppercaseString];

        NSString *DIR = [_pathstringByAppendingPathComponent:dir];

        [fm createDirectoryAtPath:DIRwithIntermediateDirectories:YESattributes:nilerror:nil];

        NSString *src = [_pathstringByAppendingPathComponent:name];

        NSString *dst = [DIRstringByAppendingPathComponent:name];

        [fmmoveItemAtPath:src toPath:dst error:nil];

    }

}


- (void)archiveFileAtPath

{

    //1、创建文件管理类的对象

    NSFileManager *fm = [NSFileManagerdefaultManager];

    //2、浅度遍历,保存到数组

    _contents.array = [fmcontentsOfDirectoryAtPath:_patherror:nil];

    //3、循环遍历数组

   for (NSString *strin _contents) {

       unichar ch = [str characterAtIndex:0];

       if (ch == '.') {

           continue;

        }

        //NSString *path = [_path stringByAppendingFormat:@"/%@", str];

        NSString *path = [_pathstringByAppendingPathComponent:str];

        //判断是否是目录

       BOOL isDir = NO;

        [fmfileExistsAtPath:path isDirectory:&isDir];

       if (isDir == YES) {

           //4-1、是目录

            [selfmoveDirectory:str];

        }else {

           //4-2、是文件

            [selfmoveFile:str];

        }

    }

}


+ (void)archiveFileAtPath:(NSString *)path

{

    NSFileManager *fm = [NSFileManagerdefaultManager];

   BOOL isDir = NO;

   BOOL isExist = [fm fileExistsAtPath:path isDirectory:&isDir];

   if (isExist == NO) {

        NSLog(@"有木有搞错,不存在咋整啊");

       return;

    }else {

       if (isDir == NO) {

           NSLog(@"知不知道什么是目录");

           return;

        }

    }

    //若是一个目录则执行以下代码

    JYFileManager *myFm = [[JYFileManageralloc] initWithPath:path];

    [myFm archiveFileAtPath];

}


@end


======main====

#define PATH @"/Users/qianfeng001/Desktop/test"


int main(int argc,const char * argv[]) {

    @autoreleasepool {

        

        [JYFileManagerarchiveFileAtPath:PATH];

        

    }

   return 0;

}



========运行前=========

97E91D67-8179-4BD9-91D3-A5E8E6AC5711.png




========运行后=========

4E27E996-8721-43B7-998E-17C1FC9FA91D.png00D9EE97-C929-4D7A-8632-3BCB004D1341.png






### 关于OCID-Grasp数据集的信息 OCID-Grasp 是一个用于机器人抓取任务的数据集,主要关注真实环境中的物体抓取。该数据集提供了丰富的标注信息以及多视角的图像采集方式,适用于训练和评估各种抓取模型[^3]。 #### 数据集下载 目前尚未有公开统一的 OCID-Grasp 官方网站提供直接下载服务。然而,可以通过以下途径尝试获取: 1. **学术合作**:联系原始研究团队或作者请求访问权限。 2. **第三方平台**:部分研究人员可能将其上传至个人主页或其他共享平台(如 Google Drive 或 Baidu Pan),需注意版权问题并遵循其使用条款。 对于百度网盘链接,虽然引用中提到了 Unity 插件 InstantOC 动态遮挡剔除的相关资源[^5],但并未提及具体针对 OCID-Grasp 的存储位置。因此建议进一步确认是否存在类似的分享路径。 #### 使用说明与文档 尽管缺乏专门面向此特定集合的标准指南文件,基于一般机器学习领域实践可推测大致流程如下: 1. **解压档案**: 将压缩包内的所有内容提取出来放到指定目录下; ```bash tar -xvzf ocid_grasp_dataset.tar.gz --directory /path/to/save/ ``` 2. **读取元数据**: 查看 README.txt (如果存在的话),了解各子文件夹含义及其对应关系;通常会包含图片序列编号、相机参数配置表单等辅助资料。 3. **加载样本**: 利用 Python 脚本批量导入所需素材以便后续处理操作前预览效果演示代码片段仅供参考: ```python import os from PIL import Image dataset_dir = '/path/to/ocid/grasp' image_files = sorted([f for f in os.listdir(dataset_dir) if f.endswith('.png')]) for img_file in image_files[:5]: im = Image.open(os.path.join(dataset_dir, img_file)) display(im) ``` 4. **调参优化**: 结合实验目标调整超参数设定比如批次大小(Batch Size), 学习率(Learning Rate)等等从而提升最终表现水平. 值得注意的是上述方法仅为理论推导所得并非绝对适用每种情形所以最好还是参照原作给出的确切指示来执行相应步骤更为稳妥可靠些. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值