obj-c编程10:Foundation库中类的使用(3)[文件管理]
好吧,不管神马系统都无可避免的要说到文件,目录,路径(PATH)管理的内容,下面我们来看看在F库中对他们的支持.我简单看了下,不谈其他光从方法命名来说就多少显得有点复杂,如果和ruby相比就呵呵了.
以下代码功能包括文件的打开,复制,移动,取其内容,文件夹的2种遍历方法(递归和非递归):
#import <Foundation/Foundation.h>
#define msg(...) NSLog(__VA_ARGS__)
int main(int argc, char *argv[]){
@autoreleasepool {
NSString *path = @"data.db";
NSFileManager *fm;
NSDictionary *attr;
fm = [NSFileManager defaultManager];
//check file is existed
if([fm fileExistsAtPath: path] == NO){
NSLog(@"file %@ don't exist!",path);
return 1;
}
//copy to new file ,new_file name must give
if([fm copyItemAtPath: path toPath: @"new_data.db" error:NULL] == NO){
NSLog(@"file copy failed!");
return 2;
}
//move file
if([fm moveItemAtPath:path toPath:@"fixed_data.db" error:NULL] == NO){
NSLog(@"file rename failed!");
return 3;
}
//cmp 2 file by contents
if([fm contentsEqualAtPath:@"fixed_data.db" andPath:@"new_data.db"] == NO){
NSLog(@"files are not Equal!");
}else{
NSLog(@"file are Equal!");
}
//get file size
if((attr = [fm attributesOfItemAtPath:@"fixed_data.db" error:NULL]) == nil){
NSLog(@"can't get file attr!");
}else{
msg(@"file size is %llu bytes",\
[[attr objectForKey: NSFileSize] unsignedLongLongValue]);
}
//at last we remove file
if([fm removeItemAtPath:@"new_data.db" error:NULL] == NO){
msg(@"file rm failed!");
}
}
return 0;
}
值得注意的是对于文件拷贝和移动操作,如果目标文件已存在就会失败.而且这两种操作都要给出目标文件名哦,切记!
对于多次操作文件内容的情况我们可以用NSData类做缓存来用,下面是另一种文件copy操作:
#import <Foundation/Foundation.h>
#define msg(...) NSLog(__VA_ARGS__)
int main(int argc, char *argv[]){
@autoreleasepool {
NSFileManager *fm;
NSData *data;
fm = [NSFileManager defaultManager];
data = [fm contentsAtPath:@"data.db"];
if(data == nil){
NSLog(@"file read failed!");
return 1;
}
if([fm createFileAtPath:@"cp_data.db" contents:data attributes:nil] == NO){
NSLog(@"can't copy file");
return 2;
}
}
return 0;
}
对于目录的遍历可以使用enumeratorAtPath或者contentsOfDirectoryAtPath:error:方法(瞧着名字起的...),前者会深入递归子文件夹中的文件而后者不会,不过也可以动态阻止其递归过程,我们在下面的代码终将会看到如何做:
#import <Foundation/Foundation.h>
#define msg(...) NSLog(__VA_ARGS__)
int main(int argc, char *argv[]){
@autoreleasepool {
NSString *path;
NSFileManager *fm;
NSDirectoryEnumerator *dir_er;
NSArray *files;
fm = [NSFileManager defaultManager];
path = [fm currentDirectoryPath];
dir_er = [fm enumeratorAtPath:path];
msg(@"PART1 : file list in %@:",path);
while((path = [dir_er nextObject]) != nil)
msg(@"%@",path);
path = [fm currentDirectoryPath];
files = [fm contentsOfDirectoryAtPath:path error:NULL];
msg(@"PART2 : all files in path :%@",files);
BOOL flag = NO;
dir_er = [fm enumeratorAtPath:path];
msg(@"PART3 : file list in %@:",path);
while((path = [dir_er nextObject]) != nil){
msg(@"%@",path);
[fm fileExistsAtPath:path isDirectory:&flag];
if(flag == YES) [dir_er skipDescendents];
}
}
return 0;
}
注意第一次枚举器dir_er枚举到结尾返回后,再一次枚举会直接返回,因为已经没有要枚举的对象了,我没有找到类似于其他语言中的rewind方法,所以只有重新给dir_er赋值鸟.运行结果如下:
wisy@wisy-ThinkPad-X61:~/src/objc_src$ ./f 2014-07-02 13:41:03.220 f[12245] PART1 : file list in /home/wisy/src/objc_src: 2014-07-02 13:41:03.222 f[12245] a 2014-07-02 13:41:03.223 f[12245] class_std 2014-07-02 13:41:03.223 f[12245] class_std/Box.m 2014-07-02 13:41:03.223 f[12245] class_std/test.m 2014-07-02 13:41:03.223 f[12245] class_std/cls_test 2014-07-02 13:41:03.223 f[12245] class_std/Box.h 2014-07-02 13:41:03.223 f[12245] class_std/cls_test.d 2014-07-02 13:41:03.223 f[12245] cp_data.db 2014-07-02 13:41:03.223 f[12245] t 2014-07-02 13:41:03.223 f[12245] dzh.m 2014-07-02 13:41:03.223 f[12245] var.m 2014-07-02 13:41:03.223 f[12245] t.d 2014-07-02 13:41:03.223 f[12245] class.m 2014-07-02 13:41:03.223 f[12245] f.m 2014-07-02 13:41:03.223 f[12245] a.d 2014-07-02 13:41:03.224 f[12245] f 2014-07-02 13:41:03.224 f[12245] normal.m 2014-07-02 13:41:03.224 f[12245] data.db 2014-07-02 13:41:03.224 f[12245] a.m 2014-07-02 13:41:03.224 f[12245] f.d 2014-07-02 13:41:03.224 f[12245] PART2 : all files in path :(a, "class_std", "cp_data.db", t, "dzh.m", "var.m", "t.d", "class.m", "f.m", "a.d", f, "normal.m", "data.db", "a.m", "f.d") 2014-07-02 13:41:03.224 f[12245] PART3 : file list in /home/wisy/src/objc_src: 2014-07-02 13:41:03.224 f[12245] a 2014-07-02 13:41:03.224 f[12245] class_std 2014-07-02 13:41:03.224 f[12245] cp_data.db 2014-07-02 13:41:03.224 f[12245] t 2014-07-02 13:41:03.224 f[12245] dzh.m 2014-07-02 13:41:03.224 f[12245] var.m 2014-07-02 13:41:03.224 f[12245] t.d 2014-07-02 13:41:03.224 f[12245] class.m 2014-07-02 13:41:03.224 f[12245] f.m 2014-07-02 13:41:03.225 f[12245] a.d 2014-07-02 13:41:03.225 f[12245] f 2014-07-02 13:41:03.225 f[12245] normal.m 2014-07-02 13:41:03.225 f[12245] data.db 2014-07-02 13:41:03.225 f[12245] a.m 2014-07-02 13:41:03.225 f[12245] f.d
待续
obj-c编程10:Foundation库中类的使用(3)[文件管理]的更多相关文章
- obj-c编程10:Foundation库中类的使用(4)[文件管理,查询当前进程信息]
接上一篇文件管理博文.我们可以用NSPathUtilities.h中包含的NSString函数和分类扩展来以兼容的方式处理路径.下面凡是有系统编程经验的童鞋都知道是啥意思了: #import < ...
- obj-c编程10:Foundation库中类的使用(2)[字符串,数组]
Foundation库的内容不可谓不多,就算很精简的说篇幅也受不了啊!笨猫一向反对博客文章一下子拖拖拉拉写一大坨!KISS哦!so将上一篇文章再分一篇来说,于是有了这篇,可能还会有(3)哦... 我发 ...
- obj-c编程10:Foundation库中类的使用(6)[线程和操作队列]
任何语言都不能避而不谈线程这个东东,虽然他是和平台相关的鸟,虽说unix哲学比较讨厌线程的说...线程不是万能灵药,但有些场合还是需要的.谈到线程就不得不考虑同步和死锁问题,见如下代码: #impor ...
- obj-c编程10:Foundation库中类的使用(5)[时间对象]
隔了好久才有了这新的一篇,还是无奈的时间啊!so这次我们就着重谈谈它喽. F库中有很多时间相关的类,比如NSDate,NSTimeInterval,NSTimeZone,NSDateComponent ...
- obj-c编程10:Foundation库中类的使用(1)[数字,字符串]
我们知道在mac或iphone上编程最终逃不开os x平台,你无法在windows或linux上开发纯正的apple程序.(so不要舍不得银子买mac啦)虽说linux和windows上有移植的obj ...
- C++的XML编程经验――LIBXML2库使用指南[转]
C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...
- Java 库:为 Java 程序员而生的 10 + 最佳库
众所周知,Java 的生态环境相当庞大,包含了数量相当可观的官方及第三方库.利用这些库,可以解决在用 Java 开发时遇到的各类问题,让开发效率得到显著提升. 举些例子,最常用的官方库有 java.l ...
- C++的XML编程经验――LIBXML2库使用指南
C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...
- 并发编程 10—— 任务取消 之 关闭 ExecutorService
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
随机推荐
- CentOS下将php和mysql命令加入到环境变量中的几种方法
Linux CentOS配置LAPM环境时,为了方便,将php和mysql命令加到系统环境命令,下面我们记录几种在linux下将php和mysql加入到环境变量中的方法. 如果在没有添加到环境变量之前 ...
- 你知道RxJava也可以实现AsyncTask吗?
使用RxJava实现异步操作(AsyncTask) 常见的异步操作我们可以联想到AsyncTask或者handler,其实google创造出的目的也就是为了让代码更加清晰明了,让代码更加简洁. 而Rx ...
- Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题
以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257 IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后, ...
- Dynamics CRM 依赖组件类型为应用程序功能区导致的无法删除实体问题的解决方法
看到有人问到这个问题,这边就简单描述下解决方法,主要是针对第一次碰到这个问题云里雾里的朋友,错误如下 在我们建lookup关联的时候有下图中的这么个设置,对于很多新手默认就是下图这样不会去做改动,因为 ...
- 剑指Offer——栈的java实现和栈的应用举例
剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...
- C++中struct类型增强
struct类型的加强: C语言的struct定义了一组变量的集合,C编译器并不认为这是一种新的类型. C++中的struct是一个新类型的定义声明. demo struct Student { ch ...
- listview下拉刷新上拉加载扩展(一)
前两篇实现了listview简单的下拉刷新和上拉加载,功能已经达到,单体验效果稍简陋,那么在这篇文章里我们来加一点效果,已达到我们常见的listview下拉刷新时的效果: 首先,在headview的x ...
- 03 SeekBar 音频播放拖拽进度条
八, SeekBar 音频播放拖拽进度条 > android:progress="40" 第一进度 and ...
- Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路, ...
- Android5.1设备无法识别exFAT文件系统的64G TF卡问题
64G TF卡刚买回来的时候默认exFAT文件系统,在电脑端(XP和WIN7)可以识别,但在我们Android5.1S设备无法识别,采用guiformat工具格式化为FAT32文件系统后才可以正常识别 ...