文件操作.docx
《文件操作.docx》由会员分享,可在线阅读,更多相关《文件操作.docx(15页珍藏版)》请在冰豆网上搜索。
![文件操作.docx](https://file1.bdocx.com/fileroot1/2022-11/23/cc30e275-7a59-4ec5-bbeb-43660adb07d9/cc30e275-7a59-4ec5-bbeb-43660adb07d91.gif)
文件操作
文件操作
管理文件(NSFileManager)
path必须是NSString,可以使用~表示用户的主目录,NSFileManager提供的操作文件的方法有:
P207一个操作文件的例子
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSString*fileName=@"file";
NSFileManager*fm;
NSDictionary*nsd;
fm=[NSFileManagerdefaultManager];
if([fmfileExistsAtPath:
fileName]==NO){
NSLog(@"文件并不存在");
return1;
}elseif([fmcopyPath:
fileNametoPath:
@"file1"handler:
nil]==NO){
NSLog(@"文件不能拷贝");
return1;
}elseif([fmcontentsEqualAtPath:
fileNameandPath:
@"file1"]==NO){
NSLog(@"文件不相等");
return1;
}elseif([fmmovePath:
fileNametoPath:
@"file2"handler:
nil]==NO){
NSLog(@"文件不能重命名");
return1;
}elseif((nsd=[fmfileAttributesAtPath:
@"file2"traverseLink:
NO])==nil){
NSLog(@"不能得到文件属性");
return1;
}elseif(nsd!
=nil){
for(NSString*strinnsd){
NSLog(@"%@:
%@",str,[nsdobjectForKey:
str]);
}
}elseif([fmremoveFileAtPath:
fileNamehandler:
nil]==NO){
NSLog(@"删除文件出错");
return1;
}
NSLog(@"程序正常运行");
//输出文件里面的string
NSLog(@"%@",[NSStringstringWithContentsOfFile:
@"file2"encoding:
NSUTF8StringEncodingerror:
nil]);
[poolrelease];
return0;
}
首先执行这个程序,必须保证生成的程序目录下有file这个文件,可以在xcode选择other创建出来,然后在里边写上:
“hello,”
“hello,”
“hello,”
结果可以看到输出:
管理目录
P210一个例子
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSString*dirName=@"dir1";
NSFileManager*fm;
NSString*path;
NSDirectoryEnumerator*dirEnum;
NSArray*dirArray;
fm=[NSFileManagerdefaultManager];
path=[fmcurrentDirectoryPath];
NSLog(@"当前的目录是:
%@",path);
if([fmcreateDirectoryAtPath:
dirNameattributes:
nil]==NO){
NSLog(@"目录创建失败");
return1;
}elseif([fmmovePath:
dirNametoPath:
@"dir2"handler:
nil]==NO){
NSLog(@"目录重命名失败");
return1;
}elseif([fmchangeCurrentDirectoryPath:
@"Lee"]==NO){
NSLog(@"设置目录失败");
return1;
}
path=[fmcurrentDirectoryPath];
NSLog(@"经过修改之后的目录为:
%@",path);
NSLog(@"使用enumeratorAtPath:
方法枚举目录:
");
dirEnum=[fmenumeratorAtPath:
path];
while((path=[dirEnumnextObject])!
=nil){
NSLog(@"%@",path);
}
NSLog(@"使用directoryContentsAtPath:
方法枚举目录");
dirArray=[fmdirectoryContentsAtPath:
[fmcurrentDirectoryPath]];
for(pathindirArray){
NSLog(@"%@",path);
}
[poolrelease];
return0;
}
需要保证在生成程序的目录底下有Lee的文件夹,里面有几个文件。
这是输出:
操作文件数据(NSData)
在基础框架中,可以使用NSData类来设置缓冲区,换句话说,可以把NSData对象当做缓冲区:
P213
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSFileManager*fm;
NSData*data;
fm=[NSFileManagerdefaultManager];
data=[fmcontentsAtPath:
@"readMe"];
if(data==nil){
NSLog(@"文件不能读取");
return1;
}elseif([fmcreateFileAtPath:
@"readMe1"contents:
dataattributes:
nil]==NO){
NSLog(@"文件不能创建");
return1;
}
NSLog(@"拷贝后的文件内容为:
");
NSLog(@"%@",[NSStringstringWithContentsOfFile:
@"readMe1"encoding:
NSUTF8StringEncodingerror:
nil]);
[poolrelease];
return0;
}
首先执行这个程序,必须保证生成的程序目录下有readMe这个文件,可以在xcode选择other创建出来,然后在里边写上:
“hello,”
“hello,”
“hello,”
结果可以看到输出:
操作目录总结
有时需要在程序中获得临时目录来创建一些临时文件,或者从主目录中读取文件。
NSTemporaryDirectory方法就是返回临时目录。
相关方法:
P215例子
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSFileManager*fm;
NSString*fName=@"readMe.h";
NSString*path,*tempDir,*extDir,*homeDir,*fullPath;
NSString*testPath=@"~Lee/sam/lee//../readMe.h";
NSArray*dirArray;
fm=[NSFileManagerdefaultManager];
tempDir=NSTemporaryDirectory();
NSLog(@"临时文件的目录为:
%@",tempDir);
path=[fmcurrentDirectoryPath];
NSLog(@"当前的文件目录是:
%@",[pathlastPathComponent]);
fullPath=[pathstringByAppendingPathComponent:
fName];
NSLog(@"添加一个带扩展名的文件%@后的完整路径为:
%@",fName,fullPath);
extDir=[fullPathpathExtension];
NSLog(@"路径%@的扩展名是%@",fullPath,extDir);
homeDir=NSHomeDirectory();
NSLog(@"用户根目录为%@",homeDir);
dirArray=[homeDirpathComponents];
for(pathindirArray){
NSLog(@"%@",path);
}
NSLog(@"%@",[testPathstringByStandardizingPath]);
[poolrelease];
return0;
}
输出为:
文件的读写(NSFileHandle)
有时需要更精确地处理文件中的内容,比如,每次读写文件中的几个字符。
这就需要使用NSFileHandle类。
方法有:
P217一个例子
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSFileHandle*file1,*file2;
NSData*fd;
file1=[NSFileHandlefileHandleForReadingAtPath:
@"readMe"];
if(file1==nil){
NSLog(@"打开文件进行读取操作失败!
");
return1;
}
[[NSFileManagerdefaultManager]createFileAtPath:
@"readMe1"contents:
nilattributes:
nil];
file2=[NSFileHandlefileHandleForWritingAtPath:
@"readMe1"];
if(file2==nil){
NSLog(@"打开文件进行写入操作失败");
return1;
}
[file2truncateFileAtOffset:
0];
fd=[file1readDataToEndOfFile];
[file2writeData:
fd];
NSLog(@"将文件1读取的内容写入文件2以后:
");
NSLog(@"%@",[NSStringstringWithContentsOfFile:
@"readMe1"encoding:
NSUTF8StringEncodingerror:
nil]);
[file2seekToEndOfFile];
[file2writeData:
fd];
NSLog(@"将我们的文件1的内容拷贝到文件2的末尾后:
");
NSLog(@"%@",[NSStringstringWithContentsOfFile:
@"readMe1"encoding:
NSUTF8StringEncodingerror:
nil]);
[file1closeFile];
[file2closeFile];
[poolrelease];
return0;
}
必须保证生成的程序目录下有readMe这个文件(否则会出现打开失败),可以在xcode选择other创建出来,然后在里边写上:
“hello,”
“hello,”
“hello,”
进程信息(NSProcessInfo)
NSProcessInfo类用于获取当前正在执行的进程信息,比如,当前机器的名称、操作系统类型等,常用方法:
P220一个例子
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSProcessInfo*proc=[NSProcessInfoprocessInfo];
NSArray*args=[procarguments];
for(NSString*str1inargs){
NSLog(@"当前进程的参数为:
%@",str1);
}
NSString*pn=[procprocessName];
NSString*hn=[prochostName];
NSLog(@"当前进程的进程名为%@,进程的主机名%@",pn,hn);
NSString*osn=[procoperatingSystemName];
NSIntegeros=[procoperatingSystem];
NSString*osvs=[procoperatingSystemVersionString];
NSLog(@"当前系统的名称为:
%@操作系统代表数字为:
%li当前系统的版本号为:
%@",osn,os,osvs);
[poolrelease];
return0;
}
综合使用了NSArray、NSProcessInfo、NSCountedSet以及NSEnumerator
P221
//
//main.m
//test
//
//CreatedbyZengon13-5-24.
//Copyright(c)2013年zeng.Allrightsreserved.
//
#import
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSArray*arr=[[NSProcessInfoprocessInfo]arguments];
NSCountedSet*cset1=[[NSCountedSetalloc]initWithArray:
arr];
NSArray*sorted_arr=[[cset1allObjects]sortedArrayUsingSelector:
@selector(compare:
)];
NSEnumerator*enmr=[sorted_arrobjectEnumerator];
idletter;
while(letter=[enmrnextObject]){
printf("%sn",[letterUTF8String]);
}
[cset1release];
[poolrelease];
return0;
}
在控制台下执行test程序,输入几个字母,然后回车
程序使用了NSCountedSet的initWithArray方法将保存在数组中的参数,存入NSCountedSet对象中,这样的操作会去除重复的参数:
NSCountedSet*cset1=[[NSCountedSetalloc]initWithArray:
arr];