在家疯狂的玩了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的时候,能给点建设性的意见,以让自己摆脱这方面的苦恼。