六.Foundation框架中常用类的介绍续

本文介绍了Foundation框架中NSFileManager和NSFileHandle类的使用方法,包括遍历目录、删除文件及目录、读写文件等,并讨论了NSThread和NSTimer的注意事项。

六.Foundation框架中常用类的介绍续

在家疯狂的玩了10天,迎来了一个崭新的农历兔年。终于熬过了自己的本命年了,过去的不顺心都忘却吧,享受自己新的一年的生活吧!虽说在家待了差不多2周,还是没有尽兴,也可能是因为大年初三就要来上班的缘故吧!在家里总觉得和朋友有说不完的话,总想着能再和家人待上一天。这也造成了初三上班的时候,到下午才到,结果被主管批了一顿,虽说是自己不对,但是总觉得这里的主管没有什么人情味。哎,不说了,大过年的影响心情。在这里祝csdn中的所有网友们,新年快乐!以下省略若干字,请各位网友自行补充。以满足各位不管是心理,还是生理的需要。闲话不多了,言归正传!

去年发表的新帖子,现在才有序实属惭愧。文件操作不管是语言和框架都是一个重点部分。下面我们就来看下foundation中文件操作的一些常用的类的用法。

首先来看下一个操作文件以及目录的重要类NSFileManager。下面还是看一段代码,来一一说明此类的用法

NSFileManager *fm;
NSDirectoryEnumerator *dirEnum;
NSArray *dirArray;
// 需要创建一个file manager的实例
fm = [NSFileManager defaultManager];

// 获取当前工作目录的路径
path = [fm currentDirectoryPath];

// 遍历这个目录
dirEnum = [fm enumeratorAtPath: path];

NSLog(@"Contents of %@:", path);

while ((path = [dirEnum nextObject]) != nil)

{

NSLog(@"%@", path);

}

// 另一种遍历目录的方法

dirArray = [fm contentsOfDirectoryAtPath: [fm currentDirectoryPath] error: nil];

NSLog(@"Contents using contentsOfDirectoryAtPath:");

for (path in dirArray)

NSLog(@"%@", path);

相信仔细看了这些代码之后,会对NSFileManager这个类如何遍历目录,有了一定的认识吧。其实这些代码都非常简单,只要查看apple developer文档都能找到的。虽说理解起来简单,但是有时候一动手写代码还是会遇到很多问题的。例如下面

NSArray *aryProvsioning = [FileManager contentsOfDirectoryAtPath:@"/vault/provisioning" error:nil];
for(NSString* provisioningFile in aryProvsioning)
{
NSLog(@"delete file:%@",provisioningFile);
[FileManager removeItemAtPath:[NSString stringWithFormat:@"/vault/provisioning/%@",provisioningFile]
error:nil];
}

这段代码的功能是删除/vault/provisioning下的所有文件,有兴趣的可以亲自实验以下,确实可以删除该文件夹下面的所有文件。但是有种情况不行,就是该文件夹下又存在文件夹的情况下,该方法removeitemAtPath就不能删除,也就是该方法只能删除文件不能删除目录,所以在用的时候要格外小心,一定要认真阅读开发文档。所以上面如果想要删除该文件夹下面的所有文件及目录,就要写成函数来递归调用。

void deleteAllAtPath(NSString *path)

{

NSArray *aryProvsioning = [FileManager contentsOfDirectoryAtPath:path error:nil];

if (aryProvsioning == nil)

return;
for(NSString* provisioningFile in aryProvsioning)
{
deleteAllAtPath(provisioningFile);

NSLog(@"delete file:%@",provisioningFile);
[FileManager removeItemAtPath:[NSString stringWithFormat:@"/vault/provisioning/%@",provisioningFile]
error:nil];
}

}

下面再来看一个读写文件的类NSFileHandle,其实它的实现就是调用c语言种文件流的操作。通过取得文件流的指针,然后定位指针的位置从而读取出文件中的内容,同样在文件中写入东西也是同样的道理,下面来看一小短代码。

NSFileHandle *TXTFileHandle;

NSString *szTXTFileTemp = @"111.txt";
TXTFileHandle = [NSFileHandle fileHandleForWritingAtPath:szTXTFileTemp];

//防止该文件不存在,如果不存在,新建该文件并写入空数据。
if(!TXTFileHandle)
{
[@"" writeToFile:szTXTFileTemp atomically:NO encoding:1 error:nil];
TXTFileHandle = [NSFileHandle fileHandleForWritingAtPath:szTXTFileTemp];
}

[TXTFileHandle seekToEndOfFile];

char * conTemp = "mengtnt";

[TXTFileHandle writeData:[NSData dataWithBytes:conTemp length:8];

[TXTFileHandle closeFile];

//下面是读取

TXTFileHandle = [NSFileHandle fileHandleForReadingAtPath:szTXTFileTemp];

NSData *fileData = [TXTFileHandle readDataToEndOfFile];

NSlog(@"%@",[[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding]);

[TXTFileHandle closeFile];

以上就是cocoa编程中文件操作的常见用法,下面再看两个类,虽说里面的方法都很简单,但是不注意一些细节还是会出问题的。

NSThread类,开启一个线程的方法在简单不过了,[NSThread detachNewThreadSelector:@selector(StartThreadTest:) toTarget:self withObject:nil];其中selector就是你要调用的线程方法。

- (void)StartThreadTest:(id)idThread
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//一些UI事件以及其他事件处理
[pool release];
}

不知道大家注意了没有,为什么线程中要加release pool那。特别是线程中有处理UI事件的时候一定要加上pool,否则你会发现应用程序运行异常的慢,甚至有的时候会crash掉。可能是线程的资源在使用时,很难判断何时使用完毕,所以编译器也就不方便自动释放这些资源,这样就要手动加上pool,使线程运行到此处的时候释放掉某些资源。究其深层的原因,自己也是一知半解。这里仅仅是自己的一些想法,还望那位高手能指点下分析的是否正确。

最后跟大家提以下NSTimer的用法,NSTimer说白了就是一个定时器,就是用来每隔一段时间运行某段代码, [NSTimer scheduledTimerWithTimeInterval:0.2
target:self
selector:@selector(DetectSN:)
userInfo:nil
repeats:YES];

当你相停止timer的时候就调用invalide方法。需要注意的一点是当NSTimer被设置无效的时候,要想使用这个timer对象,必须重新开辟一个NSTimer的对象。

那么关于NSFoundation一些类的用法就先介绍到这里吧,这些都是自己平时整理一些资料,这些类都是比较容易用到,同时也容易出错的类。希望能给大家一些帮助,同时在调试中也提高了自己的能力。以后我就来简单的分享下自己cocoa编程中ApplicationKit框架的一些简单用法,不过我一直在UI设计方面存在先天不足,也希望在介绍ApplicationKit框架,各位老鸟看到我设计的一些UI的时候,能给点建设性的意见,以让自己摆脱这方面的苦恼。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值