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—— 闭 ...
随机推荐
- Android WebView选择本地文件上传
This sample demonstrate android webview choose file to upload. I just implement the client code ,the ...
- expect 简单使用
简单的登陆脚本 这样就不用每次都输入ssh命令了,使用密码还是有些不安全,谨慎使用. #!/usr/bin/expect -f #filename: auto_login.sh #author: or ...
- ios7内购、Game Center 实现 in-App Purchases & Game Center
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=514 昨天使用ios7SDK b ...
- 高通8x12平台开机画面制作工具
你可能在网上看到很到关于手动更换手机开机图片的文章,想想自己的开机画面是小两口,好基友的照片多么个性啊.但是你有没有发现,网上下载的什么"一键生成"之类的,在你的手机上不能用啊,( ...
- HBase作为存储方案
HBase存储特点 * Client 1. 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息. * Zookeeper: 1. 选举集群中的Master, ...
- Android studio中的一次编译报错’Error:Execution failed for task ':app:transformClassesWithDexForDebug‘,困扰了两天
先说下背景:随着各种第三方框架的使用,studio在编译打包成apk时,在dex如果发现有相同的jar包,不能创建dalvik虚拟机.一个apk,就是一个运行在linux上的一个虚拟机. 上图就是一直 ...
- 某公司基于FineBI数据决策平台的试运行分析报告
一.数据平台的软硬件环境 二.组织机构和权限体系 组织机构:平台中已集成一套组织机构,可以建立部门.人员.也可以与现有系统的组织机构集成,将组织机构导入到平台中. 功能权限:通过配置功能点URL的方式 ...
- android重启代码
首先新建一个app然后添加 android:sharedUserId="android.uid.system" 再添加重启的权限 <uses-permission andro ...
- 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...
- 04_Nginx命令行参数,控制信号,Nginx启动、停止、重启命令
Nginx简单型,先关闭进程,修改你的配置后,重启进程. kill -QUIT `cat/usr/local/nginx/nginx.pid` ./nginx 2 重新加载配置文件,不重启进程, ...