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—— 闭 ...
随机推荐
- Java 中的日期与时间
Java 日期时间 标签 : Java基础 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含 ...
- Tomcat集群应用部署的实现机制
集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个tomcat实例进行部署,这些工作量都是繁杂且重复的,而对于进步青年的程序员来说是不能容忍 ...
- 3、Android构建仪表测试
不同于运行于JVM的本地单元测试,仪表测试运行于你的物理设备或虚拟机中.当你需要访问设备的信息(比如Context)或者使用真正的Android framework组件时(比如SharePrefere ...
- Android之Gallery和Spinner-Android学习之旅(二十九)
Spinner简介 spinner是竖直方向展开一个列表供选择.和gallery都是继承了AbsSpinner,AbsSpinner继承了AdapterView,因此AdaptyerView的属性都可 ...
- Douglas Adams - 3 Rules That Describe Our Reactions To Technologies 科技影响生活的三个规律
文章摘自http://highscalability.com/. 这个博客是大家都应该订阅的.原文地址http://highscalability.com/blog/2014/3/11/douglas ...
- A*寻路算法入门(五)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- iOS中分段控制器与UIScrollView结合使用
指定根视图: // 设置window的根视图控制器 self.window.rootViewController = [[UINavigationController alloc] initWithR ...
- Java线程的状态
Java线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于Thread中的State枚举中,如下所示: public enum State { /** * 至今尚未启动的线程处于这种状 ...
- 文件I/O实践(1) --基础API
什么是I/O 输入/输出是内存和外设之间拷贝数据的过程: 设备->内存: 输入操作 内存->设备: 输出操作 高级I/O: ANSI C提供的标准I/O库函数成为高级I/O, 也称为带缓冲 ...
- javascript语法之函数案例练习
需求:文本框内输入月份,弹窗提示本月天数. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...