当前位置: 首页 > news >正文

[ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】

http://blog.csdn.net/likendsl/article/details/8348939

 

1、文件的创建

 

-(IBAction) CreateFile

{

//对于错误信息

NSError *error;

// 创建文件管理器

NSFileManager *fileMgr = [NSFileManager defaultManager];

//指向文件目录

NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];


//创建一个目录

[[NSFileManager defaultManager]   createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];


// File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中

// Result is: /Documents/file1.txt结果为:/Documents/file1.txt

NSString *filePath= [documentsDirectory

stringByAppendingPathComponent:@"file2.txt"];

//需要写入的字符串

NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";

//写入文件

[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

//显示文件目录的内容

NSLog(@"Documentsdirectory:  contentsOfDirectoryAtPath:documentsDirectory error:&error]);


}

 


 

 

2、对文件重命名

 

对一个文件重命名
想要重命名一个文件,我们需要把文件移到一个新的路径下。下面的代码创建了我们所期望的目标文件的路径,然后请求移动文件以及在移动之后显示文件目录。
//通过移动该文件对文件重命名
NSString *filePath2= [documentsDirectory
stringByAppendingPathComponent:@"file2.txt"];
//判断是否移动
if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
NSLog(@"Unable to move file: %@", [error localizedDescription]);
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@",
[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);

 

 

3、删除一个文件

 


为了使这个技巧完整,让我们再一起看下如何删除一个文件:
//在filePath2中判断是否删除这个文件
if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
NSLog(@"Unable to delete file: %@", [error localizedDescription]);
//显示文件目录的内容
NSLog(@"Documentsdirectory: %@",
[fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
一旦文件被删除了,正如你所预料的那样,文件目录就会被自动清空:

这些示例能教你的,仅仅只是文件处理上的一些皮毛。想要获得更全面、详细的讲解,你就需要掌握NSFileManager文件的知识。


 

 

4、删除目录下所有文件

 

//获取文件路径
- (NSString *)attchmentFolder{

NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *path = [document stringByAppendingPathComponent:@"Attchments"];


NSFileManager *manager = [NSFileManager defaultManager];


if(![manager contentsOfDirectoryAtPath:path error:nil]){

[manager createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];

}


return path;

}

 

--清除附件
BOOL result = [[NSFileManager defaultManager] removeItemAtPath:[[MOPAppDelegate instance] attchmentFolder] error:nil];


 


IPhone中获取文件各项属性方法

-(NSData *)applicationDataFromFile:(NSString *)fileName
{
    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory =[paths objectAtIndex:0];
    NSString *appFile =[documentsDirectory stringByAppendingPathComponent:fileName];
    NSData *data =[[[NSData alloc]initWithContentsOfFile:appFile]autorelease];
    return data;
}


-(void)getFileAttributes
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/1ct.rtf";
NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:path traverseLink:YES];
    NSLog(@"@@");
if (fileAttributes != nil) {
    NSNumber *fileSize;
    NSString *fileOwner, *creationDate;
    NSDate *fileModDate;
    //NSString *NSFileCreationDate

//文件大小
    if (fileSize = [fileAttributes objectForKey:NSFileSize]) {
        NSLog(@"File size: %qi\n", [fileSize unsignedLongLongValue]);
    }

//文件创建日期
    if (creationDate = [fileAttributes objectForKey:NSFileCreationDate]) {
        NSLog(@"File creationDate: %@\n", creationDate);
        //textField.text=NSFileCreationDate;
    }

//文件所有者
    if (fileOwner = [fileAttributes objectForKey:NSFileOwnerAccountName]) {
        NSLog(@"Owner: %@\n", fileOwner);
    }

//文件修改日期
    if (fileModDate = [fileAttributes objectForKey:NSFileModificationDate]) {
        NSLog(@"Modification date: %@\n", fileModDate);
    }
 }
else {
    NSLog(@"Path (%@) is invalid.", path);
   }
}

 

 

///

文件类型,文件缩略图呢???

 

============================

//获取当前应用程序的主目录
NSString directoryPath =NSHomeDirectory();


//获取当前目录下的所有文件
NSArray directoryContents = [[NSFileManager defaultManager] directoryContentsAtPath: directoryPath];

 

//获取一个文件或文件夹
NSString *selectedFile = (NSString*)[directoryContents objectAtIndex: indexPath.row];


//拼成一个完整路径
[directoryPath stringByAppendingPathComponent: selectedFile];

 

 


BOOL isDir;

//判断是否是为目录


if ([[NSFileManager defaultManager] fileExistsAtPath:selectedPath isDirectory:&isDir] && isDir)

{//目录
}

else

{//文件
}

 

 

 

 

//日期格式化
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

[dateFormatter setTimeStyle:NSDateFormatterNoStyle];


//数字格式化

NSNumberFormatter *numberFormatter =[[NSNumberFormatter alloc] init];

[numberFormatter setPositiveFormat: @"#,##0.## bytes"];

 

 

//获取文件属性

NSDictionary *fileAttributes =[[NSFileManager defaultManager] fileAttributesAtPath: directoryPath traverseLink: YES];

//获取文件的创建日期

NSDate *modificationDate = (NSDate*)[fileAttributes objectForKey: NSFileModificationDate];

//获取文件的字节大小

NSNumber *fileSize = (NSNumber*)[fileAttributes objectForKey: NSFileSize];
//格式化文件大小
nsstring A = [numberFormatter stringFromNumber: fileSize];

//格式化文件创建日期

NSstring B =[dateFormatter stringFromDate: modificationDate];

 


[numberFormatter release];

[dateFormatter release];

 

//读取文件内容操作 - (void) loadFileContentsIntoTextView{

 

 

//通过流打开一个文件

 

NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath: filePath];

 

[inputStream open];

 


NSInteger maxLength = 128;

uint8_t readBuffer [maxLength];

//是否已经到结尾标识

BOOL endOfStreamReached = NO;

// NOTE: this tight loop will block until stream ends

while (! endOfStreamReached)

{

NSInteger bytesRead = [inputStream read: readBuffer maxLength:maxLength];

if (bytesRead == 0)

{//文件读取到最后

endOfStreamReached = YES;

}

else if (bytesRead == -1)

{//文件读取错误

endOfStreamReached = YES;

}

else

{

NSString *readBufferString =[[NSString alloc] initWithBytesNoCopy: readBuffer length: bytesRead encoding: NSUTF8StringEncoding freeWhenDone: NO];   

//将字符不断的加载到视图

[self appendTextToView: readBufferString];

[readBufferString release];

}

}

[inputStream close];

[inputStream release];

}

 

异步文件的读取 ,在网络方面,由于网络的不可靠性可能会造成NSFileManager的文件操作方法的阻塞,而以流的方式进行操作则可以实现异步的读取。

NSStream是可以异步工作的。可以注册一个在流中有字节可读的时候回调的函数,如果没有可读的,就不要阻塞住,回调出去。

 

 

 

 

1、在Documents里创建目录

创建一个叫test的目录,先找到Documents的目录,

[cpp] view plain copy
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
  2.    NSString *documentsDirectory = [paths objectAtIndex:0];    
  3.    NSLog(@"documentsDirectory%@",documentsDirectory);    
  4.    NSFileManager *fileManager = [NSFileManager defaultManager];    
  5.    NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
  6.    // 创建目录  
  7.    [fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];  

启动程序,这时候目录就创建了:

 

2、在test目录下创建文件

创建文件怎么办呢?接着上面的代码 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。这样才能在test下写入文件。

testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test00.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。

实现代码如下:

[cpp] view plain copy
  1. NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];    
  2. NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"];    
  3. NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"];    
  4.   
  5.   
  6. NSString *string = @"写入内容,write String";  
  7. [fileManager createFileAtPath:testPath contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
  8. [fileManager createFileAtPath:testPath2 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
  9. [fileManager createFileAtPath:testPath3 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  

看下面的图,三个文件都出来了,内容也对。

在Documents目录下创建就更简单了,不用加test就ok了

3、获取目录列里所有文件名

两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPath

[cpp] view plain copy
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
  2. NSString *documentsDirectory = [paths objectAtIndex:0];    
  3. NSLog(@"documentsDirectory%@",documentsDirectory);    
  4. NSFileManager *fileManage = [NSFileManager defaultManager];    
  5. NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
  6. NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];   
  7. NSLog(@"%@",file);    
  8. NSArray *files = [fileManage subpathsAtPath: myDirectory ];   
  9. NSLog(@"%@",files);  

获取上面刚才test文件夹里的文件名

打印结果

2012-06-17 23:23:19.684 IosSandbox[947:f803] fileList:(

    ".DS_Store",

    "test00.txt",

    "test22.txt",

    "test33.txt"

)

2012-06-17 23:23:19.686 IosSandbox[947:f803] fileLit(

    ".DS_Store",

    "test00.txt",

    "test22.txt",

    "test33.txt"

)

两个方法都可以,隐藏的文件也打印出来了。

4、fileManager使用操作当前目录

[cpp] view plain copy
  1. //创建文件管理器  
  2.     NSFileManager *fileManager = [NSFileManager defaultManager];  
  3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4.     NSString *documentsDirectory = [paths objectAtIndex:0];  
  5.     //更改到待操作的目录下  
  6.     [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];  
  7.     //创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil  
  8.     NSString * fileName = @"testFileNSFileManager.txt";  
  9.     NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];  
  10.     [fileManager createFileAtPath:fileName contents:array attributes:nil];  

这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了

changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径

5、删除文件

接上面的代码,remove就ok了。

[cpp] view plain copy
  1. [fileManager removeItemAtPath:fileName error:nil];  

6、混合数据的读写

用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来

6.1写入数据:

[cpp] view plain copy
  1. NSString * fileName = @"testFileNSFileManager.txt";  
  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  3. NSString *documentsDirectory = [paths objectAtIndex:0];  
  4. //获取文件路径  
  5. NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];  
  6. //待写入的数据  
  7. NSString *temp = @"nihao 世界";  
  8. int dataInt = 1234;  
  9. float dataFloat = 3.14f;  
  10. //创建数据缓冲  
  11. NSMutableData *writer = [[NSMutableData alloc] init];  
  12. //将字符串添加到缓冲中  
  13. [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];     
  14. //将其他数据添加到缓冲中  
  15. [writer appendBytes:&dataInt length:sizeof(dataInt)];  
  16. [writer appendBytes:&dataFloat length:sizeof(dataFloat)];    
  17. //将缓冲的数据写入到文件中  
  18. [writer writeToFile:path atomically:YES];  


我们看看数据怎么样了:


我们看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制

6.2读取刚才写入的数据:

[cpp] view plain copy
  1. //读取数据:  
  2.    int intData;  
  3.    float floatData = 0.0;  
  4.    NSString *stringData;  
  5.      
  6.    NSData *reader = [NSData dataWithContentsOfFile:path];  
  7.    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]  
  8.                                   encoding:NSUTF8StringEncoding];  
  9.    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];  
  10.    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];  
  11.    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);  


打印出来的结果:

2012-06-17 23:51:14.723 IosSandbox[1285:f803] stringData:nihao hello! intData:1234332 floatData:3.140000

这里把写入的汉字改成了 hello。因为[temp length]算长度是,把中文算成一位了,出来的结果有误。

 

例子代码:https://github.com/schelling/YcDemo

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢

转载于:https://www.cnblogs.com/jinjiantong/archive/2013/04/08/3006597.html

相关文章:

  • 我是这样给Ubuntu Server服务器版安装桌面(Gnome Desktop)环境的
  • sqlserver 批量插入数据(此方式同样适用mysql)
  • [译]移动开发在2010年及以后的商用发展走势(五)
  • 黑马程序员__div+css布局总结
  • newInstance() 和 new 有什么区别?
  • Oracle工具的探索之旅(四)
  • AJAX 局部刷新 GridView 进行数据绑定
  • Ubuntu高仿MAC界面
  • javascript/dom:获取CSS值/getComputedStyle方法
  • ssh_ch06:hibernate外键对应设置
  • [翻译]NUnit---String Collection File Directory Assert (七)
  • DataTable对象重组时,错误提示“该行已经属于另一个表”
  • hdu 2516博弈找规律
  • SQL查询:主从表 报表方式显示
  • Linux图形界面中客户端、服务器、窗口管理器之间的关系
  • cookie和session
  • ES6--对象的扩展
  • JavaScript 基本功--面试宝典
  • JavaWeb(学习笔记二)
  • oldjun 检测网站的经验
  • 给github项目添加CI badge
  • 前端
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 我的zsh配置, 2019最新方案
  • 昨天1024程序员节,我故意写了个死循环~
  • ​【已解决】npm install​卡主不动的情况
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Linux·i2c驱动架构​
  • ​马来语翻译中文去哪比较好?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###C语言程序设计-----C语言学习(3)#
  • $ git push -u origin master 推送到远程库出错
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (145)光线追踪距离场柔和阴影
  • (2)Java 简介
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)springcloud实战之config配置中心
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计高校学生选课系统
  • (转)ORM
  • .NET Micro Framework初体验
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net生成的类,跨工程调用显示注释
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net与java建立WebService再互相调用
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [20170713] 无法访问SQL Server
  • [4.9福建四校联考]
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AutoSar]BSW_Com02 PDU详解
  • [CF543A]/[CF544C]Writing Code
  • [Java开发之路](14)反射机制
  • [Linux打怪升级之路]-vim编辑器(看就能马上操作噢)