文件的操作(转)

转自http://blog.csdn.net/jiangwei0910410003/article/details/41875015

第一、首先来看一下本身NSString类给我们提供了哪些可以操作文件路径名的方法

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  37_FilePathHandle
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. int main(int argc, const charchar * argv[]) {
  10. @autoreleasepool {
  11. //演示路径
  12. NSString *path = @"/Users/jiangwei/file.text";
  13. //1.返回路径的组成部分
  14. NSArray *array = [path pathComponents];
  15. NSLog(@"%@",array);
  16. //2.返回路径最后组成部分
  17. NSString *str = [path lastPathComponent];
  18. NSLog(@"%@",str);
  19. //3.在原有的路径后面追加子目录
  20. //这种方式有一点不好,就是需要添加/
  21. [path stringByAppendingString:@"/appFile.text"];
  22. //不需要添加/
  23. [path stringByAppendingPathComponent:@"appFile.text"];
  24. //4.删除最后的组成部分
  25. str = [path stringByDeletingLastPathComponent];
  26. //删除扩展名(.text被删除了)
  27. str = [path stringByDeletingPathExtension];
  28. //5.获取扩展名
  29. str = [path pathExtension];
  30. //6.添加扩展名
  31. [path stringByAppendingPathExtension:@".jpg"];
  32. }
  33. return 0;
  34. }

在Java中,我们知道,当我们去操作一个文件的时候,最开始的时候肯定要去构建一个路径,这个路径一般都是String类型的,我们需要定义不同的路径和文件名,OC中也不例外,不过OC中的NSString类在这方面做的可能会更好,下面依次来看一下他的方法:

1、将路径进行分割

[java] view plaincopy

  1. //演示路径
  2. NSString *path = @"/Users/jiangwei/file.text";
  3. //1.返回路径的组成部分
  4. NSArray *array = [path pathComponents];
  5. NSLog(@"%@",array);

运行结果:


返回的一个数组,将路径分割了,但是需要注意的是,第一个是"/",这个也算是路径的一部分。

2、返回路径的最后组成部分

[objc] view plaincopy

  1. //2.返回路径最后组成部分
  2. NSString *str = [path lastPathComponent];
  3. NSLog(@"%@",str);

运行结果:


这个直接返回路径的最后一部分,这个如果放在Java中,我们可能需要用到String类的字符串分割技术了,没有这里的方便

3、添加子目录/子文件

[objc] view plaincopy

  1. //3.在原有的路径后面追加子目录
  2. //这种方式有一点不好,就是需要添加/
  3. //演示路径
  4. str = [path stringByAppendingString:@"/appFile.text"];
  5. NSLog(@"%@",str);
  6. //不需要添加/
  7. str = [path stringByAppendingPathComponent:@"appFile.text"];
  8. NSLog(@"%@",str);

这里其实有两种方式可以添加,第一种是直接使用拼接字符串的方式,但是需要手动的添加"/",第二种方式是NSString提供的,不需要手动的添加"/"

运行结果:

4、删除最后面的部分和后缀名

[objc] view plaincopy

  1. //4.删除最后的组成部分
  2. str = [path stringByDeletingLastPathComponent];
  3. NSLog(@"%@",str);
  4. //删除扩展名(.text被删除了)
  5. str = [path stringByDeletingPathExtension];
  6. NSLog(@"%@",str);

运行结果:

5、获取扩展名

[objc] view plaincopy

  1. //5.获取扩展名
  2. str = [path pathExtension];
  3. NSLog(@"%@",str);

运行结果:

6、添加扩展名

[objc] view plaincopy

  1. //6.添加扩展名
  2. str = [path stringByAppendingPathExtension:@"jpg"];
  3. NSLog(@"%@",str);

运行结果:

上面就是总结了NSString类中操作文件路径的一些方法,其实这些操作如果放在Java中做的话,就是需要使用String的分割,拼接等技术了。这里看到OC给我们提供了便捷

第二、在来看一下操作文件之前需要了解的一个对象:NSData

这个类的作用就是将我们写入到文件中的数据进行编码和解码操作

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  38_NSData
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. //NSData类型
  10. //是一种存储形式
  11. int main(int argc, const charchar * argv[]) {
  12. @autoreleasepool {
  13. //存储是有编码方式的,编程字节码
  14. //相当于Java中的解码和编码
  15. NSString *s = @"tsdfsdfsdfsdf";
  16. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
  17. s = [[NSString alloc] initWithData:data encoding:(NSUTF8StringEncoding)];
  18. //可变对象 NSMutableData 可以追加数据
  19. }
  20. return 0;
  21. }

这个和Java中String直接在构造的时候就可以进行编码和解码了,这里需要使用中间类NSData,当然这个类是不可变的,如果想追加内容的话,需要使用NSMutableData类

第三、说完了NSData这个中间类,下面来正式说文件的操作了

但是这里对文件的操作,我们放到IOS平台去操作,因为我们后面也是会介绍IOS中文件的操作,所以就直接在这里说了,当然这里的知识会有点冲突,但是我们不关心IOS中的其他技术,只看他的文件操作:

1、沙盒文件

在IOS中,每个应用程序都是一个沙盒,他们有自己的文件目录,这个目录对其他程序是不可见的,和Android中的/data/data/包名/中的内容差不多,当然IOS中的沙盒目录有三种:

Documents:存放长期使用的文件(一般存放目录)

Library:系统存放文件

tmp:临时文件,app重启时,该目录下得文件清空

下面来看一个简单的例子吧:

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  36_SandBoxFile
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AppDelegate.h"
  10. int main(int argc, charchar * argv[]) {
  11. @autoreleasepool {
  12. //获取沙盒目录
  13. //默认有三个文件夹
  14. //Documents:存放长期使用的文件(一般存放目录)
  15. //Library:系统存放文件
  16. //tmp:临时文件,app重启时,该目录下得文件清空
  17. //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library
  18. NSString *homePath = NSHomeDirectory();
  19. NSLog(@"沙盒目录:%@",homePath);
  20. //第二种方式,直接使用Api获取
  21. //NSDocumentDirectory:Documents文件夹
  22. //NSLibraryDirectory:Library文件夹
  23. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  24. NSLog(@"%@",array);
  25. NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  26. NSLog(@"%@",array1);
  27. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  28. }
  29. }

创建IOS项目和OC差不多:

后续的操作就一样了,创建完之后的项目结构:


我们在main.m文件中写我们的代码就可以了。

下面来看代码:

[java] view plaincopy

  1. //第一种获取方式,我们得到Home目录之后,手动的去拼接Document/Library
  2. NSString *homePath = NSHomeDirectory();
  3. NSLog(@"沙盒目录:%@",homePath);

获取沙盒的home目录,然后我们可以操作在其下面创建子目录了

这里有两种方式去创建Document等目录,一种是我们用上面NSString类提供的方法去手动拼接目录

还有一种是用系统给我们提供的方法,这两种都是可以的

[java] view plaincopy

  1. //第二种方式,直接使用Api获取
  2. //NSDocumentDirectory:Documents文件夹
  3. //NSLibraryDirectory:Library文件夹
  4. NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  5. NSLog(@"%@",array);
  6. NSArray *array1 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
  7. NSLog(@"%@",array1);

看一下运行结果:

第四、了解了程序的沙盒目录,下面继续来看一下操作文件的两个类

一、NSFileManager

这个类的主要功能是对文件进行操作:创建,复制,剪切,删除等

看代码:

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  39_NSFileManager
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AppDelegate.h"
  10. //NSFileManager:对文件进行操作的,包括复制,粘贴,删除,剪切等操作
  11. int main(int argc, charchar * argv[]) {
  12. @autoreleasepool {
  13. //------------------创建文件/文件夹
  14. //获取沙盒目录
  15. NSString *homePath = NSHomeDirectory();
  16. //在沙盒目录中创建一个文件file.text
  17. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
  18. //NSFileManager是单利模式,所以不能使用alloc+init创建
  19. NSFileManager *manager = [NSFileManager defaultManager];
  20. NSString *str = @"无线互联";
  21. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  22. //参数:文件路径、文件内容、文件的属性
  23. BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];
  24. if(sucess){
  25. NSLog(@"文件创建成功");
  26. }else{
  27. NSLog(@"文件创建失败");
  28. }
  29. //创建文件夹
  30. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];
  31. NSError *error;
  32. //需要传递一个创建失败的指针对象,记录创建失败的信息
  33. BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];
  34. if(!success1){
  35. NSLog(@"创建成功");
  36. }else{
  37. NSLog(@"创建失败");
  38. }
  39. //--------------------读取文件
  40. //根据路径读取文件内容
  41. NSData *datas = [manager contentsAtPath:filePath];
  42. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  43. NSLog(@"%@",s);
  44. //--------------------移动文件/剪切文件
  45. //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作
  46. //把filePath移动到targetPath目录中
  47. NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];
  48. BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];
  49. if(sucess2) {
  50. NSLog(@"移动成功");
  51. }else{
  52. NSLog(@"移动失败");
  53. }
  54. //--------------------复制文件
  55. BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];
  56. if(sucess3){
  57. //复制成功
  58. }else{
  59. //复制失败
  60. }
  61. //--------------------删除文件
  62. //删除之前需要判断这个文件是否存在
  63. BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在
  64. if(isExist){
  65. BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];
  66. if(sucess4){
  67. //删除成功
  68. }else{
  69. //删除失败
  70. }
  71. }
  72. //--------------------获取文件的属性
  73. NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];
  74. NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key
  75. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  76. }
  77. }

1、创建文件

[objc] view plaincopy

  1. //------------------创建文件/文件夹
  2. //获取沙盒目录
  3. NSString *homePath = NSHomeDirectory();
  4. //在沙盒目录中创建一个文件file.text
  5. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
  6. //NSFileManager是单利模式,所以不能使用alloc+init创建
  7. NSFileManager *manager = [NSFileManager defaultManager];
  8. NSString *str = @"无线互联";
  9. NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
  10. //参数:文件路径、文件内容、文件的属性
  11. BOOL sucess = [manager createFileAtPath:filePath contents:data attributes:nil];
  12. if(sucess){
  13. NSLog(@"文件创建成功");
  14. }else{
  15. NSLog(@"文件创建失败");
  16. }

NSFileManager内部使用了单例模式,这个后面会说到OC中得单例模式,然后就是构建一个NSData类,最后使用createFileAtPath方法创建文件,不过最后的attributes参数一般是用来给这个文件定义一些属性的,当然文件本身也是有很多默认的属性,比如文件的大小,文件的创建日期等,我们也可以自己在追加一些属性。

2、创建文件夹

[java] view plaincopy

  1. //创建文件夹
  2. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/file"];
  3. NSError *error;
  4. //需要传递一个创建失败的指针对象,记录创建失败的信息
  5. BOOL success1 = [manager createDirectoryAtPath:filePaths withIntermediateDirectories:YES attributes:nil error:&error];
  6. if(!success1){
  7. NSLog(@"创建成功");
  8. }else{
  9. NSLog(@"创建失败");
  10. }

从这两个操作看出来,他和Java中的File类很相似的

3、读取文件

[java] view plaincopy

  1. //--------------------读取文件
  2. //根据路径读取文件内容
  3. NSData *datas = [manager contentsAtPath:filePath];
  4. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  5. NSLog(@"%@",s);

4、剪切文件

[objc] view plaincopy

  1. //--------------------移动文件/剪切文件
  2. //NSFileManager中没有提供重命名的方法,所以我们可以借助移动的api进行操作
  3. //把filePath移动到targetPath目录中
  4. NSString *targetPath = [homePath stringByAppendingPathComponent:@"Documents/file/file2.text"];
  5. BOOL sucess2 = [manager moveItemAtPath:filePath toPath:targetPath error:nil];
  6. if(sucess2) {
  7. NSLog(@"移动成功");
  8. }else{
  9. NSLog(@"移动失败");
  10. }

这里有两个参数:一个是需要移动文件的路径,和需要移动到哪的路径

5、复制文件

[objc] view plaincopy

  1. //--------------------复制文件
  2. BOOL sucess3 = [manager copyItemAtPath:filePath toPath:targetPath error:nil];
  3. if(sucess3){
  4. //复制成功
  5. }else{
  6. //复制失败
  7. }

6、删除文件

[objc] view plaincopy

  1. //--------------------删除文件
  2. //删除之前需要判断这个文件是否存在
  3. BOOL isExist = [manager fileExistsAtPath:filePath];//判断文件是否存在
  4. if(isExist){
  5. BOOL sucess4 = [manager removeItemAtPath:filePath error:nil];
  6. if(sucess4){
  7. //删除成功
  8. }else{
  9. //删除失败
  10. }
  11. }

7、操作文件的属性

[objc] view plaincopy

  1. //--------------------获取文件的属性
  2. NSDictionary *dic = [manager attributesOfItemAtPath:filePath error:nil];
  3. NSLog(@"%@",dic);//通过打印我们就可以查看文件属性的一些key

属性一般是NSDictionary

二、NSFileHandle

这个类主要是对文件进行读写操作的

看代码:

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  40_NSFileHandle
  4. //
  5. //  Created by jiangwei on 14-10-13.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AppDelegate.h"
  10. //写文件,我们之前使用各种数据结构来存储数据:NSString,NSData,NSDictionary,NSArray等,他们都是有一个writeToFile方法用来写文件的
  11. //纯文本:没有任何格式的数据
  12. //非纯文本:有修饰的数据(字体大小,字体颜色等)
  13. //数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary
  14. //数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑
  15. int main(int argc, charchar * argv[]) {
  16. @autoreleasepool {
  17. //1.-------------------字符串读写文件
  18. NSString *str = @"无线互联";
  19. NSString *homePath = NSHomeDirectory();
  20. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
  21. //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败
  22. //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写
  23. //成功,旧的文件也丢失了
  24. //所以这时候atomically参数:
  25. //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了
  26. BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
  27. if(sucess){
  28. //写入成功
  29. }else{
  30. //写入失败
  31. }
  32. //读取文件内容到字符串中
  33. //类方法
  34. NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
  35. //构造方法
  36. //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
  37. NSLog(@"%@",str1);
  38. //2.--------------------NSData读写
  39. //创建NSData的同时读取文件中的内容
  40. NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
  41. //NSData转化成NSString
  42. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  43. NSLog(@"%@",s);
  44. //写文件
  45. BOOL sucess1 = [data writeToFile:filePath atomically:YES];
  46. if(sucess1){
  47. //写入成功
  48. }else{
  49. //写入失败
  50. }
  51. //3.--------------------NSArray读写文件
  52. NSArray *array = @[@"zhangsan",@"lisi"];
  53. //属性文件一般后缀名为.plist
  54. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];
  55. BOOL sucess2 = [array writeToFile:filePaths atomically:YES];
  56. if(sucess2){
  57. //写入成功
  58. }else{
  59. //写入失败
  60. }
  61. //读文件
  62. NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];
  63. NSLog(@"%@",arrays);
  64. //4.---------------------NSDictionary读写文件
  65. NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};
  66. BOOL sucess3 = [dic writeToFile:filePath atomically:YES];
  67. if(sucess3){
  68. //写入成功
  69. }else{
  70. //写入失败
  71. }
  72. //读文件
  73. dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
  74. NSLog(@"%@",dic);
  75. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  76. }
  77. }

这个类就和Java中的FileInputStream/FileOutputStream类似了

其实我们在之前看到归档和解档操作的时候,那就是相当于写文件和读文件操作了。

1、字符串直接写入文件

[objc] view plaincopy

  1. //1.-------------------字符串读写文件
  2. NSString *str = @"无线互联";
  3. NSString *homePath = NSHomeDirectory();
  4. NSString *filePath = [homePath stringByAppendingPathComponent:@"Documents/file.text"];
  5. //现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败
  6. //但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写
  7. //成功,旧的文件也丢失了
  8. //所以这时候atomically参数:
  9. //YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了
  10. BOOL sucess = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
  11. if(sucess){
  12. //写入成功
  13. }else{
  14. //写入失败
  15. }
  16. //读取文件内容到字符串中
  17. //类方法
  18. NSString *str1 = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
  19. //构造方法
  20. //str1 = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
  21. NSLog(@"%@",str1);

我们使用拼接的方式创建Documents目录中的file.text文件,然后将字符串内容写入到其中。

writeToFile方法进行写入

其实OC中的各种数据结构都有这个方法的:NSString,NSData,NSArray,NSSet,NSDirctionary等

这里有两点要注意的:

1)

数组只能将如下类型写入文件,如果包含其他对象,将写入失败:NSNumber,NSString,NSData,NSDate,NSArray,NSDictionary

数组、字典写入的文件叫做属性文件,可以使用xcode进行编辑

这个就是系统提供的一个属性文件:info.plist

这个和Java中的Property文件很类似

2)writeToFile方法的第一个参数:automically

现在有这样的场景,第一次把字符串写入到文件中,当我们修改字符串之后,再次写入的时候,但是可能会写入失败但是之前的内容也有可能丢失,因为每次在写入新的内容的时候,会剪切之前的内容,所以这里就有可能新的没有写成功,旧的文件也丢失了所以这时候atomically参数:YES:会将新内容先写入到一个缓存文件中,如果写入缓存成功之后,这时候就将这个缓存文件替换旧文件,这样就很安全了

2、NSData的内容读写

[objc] view plaincopy

  1. //2.--------------------NSData读写
  2. //创建NSData的同时读取文件中的内容
  3. NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
  4. //NSData转化成NSString
  5. NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  6. NSLog(@"%@",s);
  7. //写文件
  8. BOOL sucess1 = [data writeToFile:filePath atomically:YES];
  9. if(sucess1){
  10. //写入成功
  11. }else{
  12. //写入失败
  13. }

3、NSArray的内容读写

[objc] view plaincopy

  1. //3.--------------------NSArray读写文件
  2. NSArray *array = @[@"zhangsan",@"lisi"];
  3. //属性文件一般后缀名为.plist
  4. NSString *filePaths = [homePath stringByAppendingPathComponent:@"Documents/array.plist"];
  5. BOOL sucess2 = [array writeToFile:filePaths atomically:YES];
  6. if(sucess2){
  7. //写入成功
  8. }else{
  9. //写入失败
  10. }
  11. //读文件
  12. NSArray *arrays = [[NSArray alloc] initWithContentsOfFile:filePath];
  13. NSLog(@"%@",arrays);

4、NSDirctionary的内容读写

[objc] view plaincopy

  1. //4.---------------------NSDictionary读写文件
  2. NSDictionary *dic = @{@"zhang":@"zhangsan",@"li":@"lisi"};
  3. BOOL sucess3 = [dic writeToFile:filePath atomically:YES];
  4. if(sucess3){
  5. //写入成功
  6. }else{
  7. //写入失败
  8. }
  9. //读文件
  10. dic = [[NSDictionary alloc] initWithContentsOfFile:filePath];
  11. NSLog(@"%@",dic);

上面说到的系统的info.plist文件就是NSDirctionary

三、在来看一下NSFileHandle的其他用法

[objc] view plaincopy

  1. //
  2. //  main.m
  3. //  41_NSFileHandleTest
  4. //
  5. //  Created by jiangwei on 14-10-14.
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #import "AppDelegate.h"
  10. //NSFileHandle是对文件内容进行读写
  11. int main(int argc, charchar * argv[]) {
  12. @autoreleasepool {
  13. //追加数据
  14. NSString *str = @"无线互联";
  15. NSString *homePath = NSHomeDirectory();
  16. NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];
  17. [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件
  18. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
  19. //默认是从开始位置写,所以我们需要将写入游标设置到尾部
  20. //从文件的末尾写入
  21. [handle seekToEndOfFile];
  22. NSString *s = @"123";
  23. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
  24. [handle writeData:data];
  25. //关闭文件
  26. [handle closeFile];
  27. //读取文件
  28. NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];
  29. //获取文件的大小
  30. NSFileManager *fileManager = [NSFileManager defaultManager];
  31. NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];
  32. NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];
  33. long long sizeValue = [fileSize longLongValue];
  34. //设置偏移量
  35. [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置
  36. //从当前偏移量读到文件末尾
  37. NSData *datas = [handle readDataToEndOfFile];
  38. NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];
  39. NSLog(@"%@",s2);
  40. //一个汉字占用两个字节,有时候可能会将一个汉字分成两半,有乱码的问题,需要注意
  41. //实现复制文件的功能
  42. //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager
  43. NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];
  44. NSFileManager *fileManagers = [NSFileManager defaultManager];
  45. [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];
  46. //创建读取文件的handle
  47. NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];
  48. //创建写文件的handle
  49. NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];
  50. //从当前偏移量读取到文件的末尾
  51. NSData *datass = [readHandles readDataToEndOfFile];
  52. //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强
  53. //[readHandles availableData];
  54. [writeHandles writeData:datass];
  55. //关闭文件
  56. [readHandles closeFile];
  57. [writeHandles closeFile];
  58. //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段
  59. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  60. }
  61. }

1、对原有的内容进行追加操作

[objc] view plaincopy

  1. //追加数据
  2. NSString *str = @"无线互联";
  3. NSString *homePath = NSHomeDirectory();
  4. NSString *filePath = [homePath stringByAppendingPathComponent:@"file.test"];
  5. [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];//写入文件
  6. NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
  7. //默认是从开始位置写,所以我们需要将写入游标设置到尾部
  8. //从文件的末尾写入
  9. [handle seekToEndOfFile];
  10. NSString *s = @"123";
  11. NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
  12. [handle writeData:data];
  13. //关闭文件
  14. [handle closeFile];

记得操作完之后,关闭文件,我们在追加文件的时候,只要在将当前游标移动到文件的末尾处即可,默认是在开始处

2、读取文件的任何位置内容

[objc] view plaincopy

  1. //读取文件
  2. NSFileHandle *handles = [NSFileHandle fileHandleForReadingAtPath:filePath];
  3. //获取文件的大小
  4. NSFileManager *fileManager = [NSFileManager defaultManager];
  5. NSDictionary *fileAttr = [fileManager attributesOfItemAtPath:filePath error:nil];
  6. NSNumber *fileSize = [fileAttr objectForKey:NSFileSize];
  7. long long sizeValue = [fileSize longLongValue];
  8. //设置偏移量
  9. [handle seekToFileOffset:sizeValue/2];//将偏移量设置到中间位置
  10. //从当前偏移量读到文件末尾
  11. NSData *datas = [handle readDataToEndOfFile];
  12. NSString *s2 = [[NSString alloc] initWithData:datas encoding:NSUTF8StringEncoding];
  13. NSLog(@"%@",s2);

还是设置一下游标的位置即可

3、实现文件的复制功能

[objc] view plaincopy

  1. //实现复制文件的功能
  2. //使用NSFileHandle只能读写已经存在的文件,不能创建文件,创建文件应该使用NSFileManager
  3. NSString *targetPath = [homePath stringByAppendingPathComponent:@"files.test"];
  4. NSFileManager *fileManagers = [NSFileManager defaultManager];
  5. [fileManagers createFileAtPath:targetPath contents:nil attributes:nil];
  6. //创建读取文件的handle
  7. NSFileHandle *readHandles = [NSFileHandle fileHandleForReadingAtPath:filePath];
  8. //创建写文件的handle
  9. NSFileHandle *writeHandles = [NSFileHandle fileHandleForWritingAtPath:targetPath];
  10. //从当前偏移量读取到文件的末尾
  11. NSData *datass = [readHandles readDataToEndOfFile];
  12. //还有一种方式读取文件,既可以读取文件,也可以读流,功能更强
  13. //[readHandles availableData];
  14. [writeHandles writeData:datass];
  15. //关闭文件
  16. [readHandles closeFile];
  17. [writeHandles closeFile];
  18. //这里有问题,就是读取文件的时候全部读取了,这样会很占内存的,所以我们应该将读取内容进行分段

这里的这种方式是:直接将源文件内容全部读取出来,然后写入到目标文件中,这样做有一个坏处,如果这个文件的内容太大,那么一次读取出那么多内容,内存会爆的,所以应该采用分段读取,这个就用到了上面说到的读取文件的任意位置的内容

总结

这一篇主要是介绍了文件的操作,对于文件的操作,后面的IOS开发过程中会经常用到,所以也是一个重点,当然还有一点需要说明的是,OC中的文件操作比Java中的文件操作方便多了。

时间: 2024-07-31 21:49:06

文件的操作(转)的相关文章

Python中文件的操作

文件的操作介绍 文件打开的方法 主要有两种: no with 格式:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 常用:variable = open('路径\文件',mode,encoding=None) variable.close() #不使用with方法时,在文件操作结束时要关闭文件 with 格式:with open('路径\

C语言文件读写操作总结

C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char

.net对文件的操作之对文件目录的操作

.NET 提供一个静态File类用于文件的操作,下面列出它的主要操作方法. 返回值类型 方法名称 说明 bool Exists(string path) 用于检查指定文件是否存在 void Copy(string sourceFilePath,string destinationFilePath) 将指定路径的源文件中的内容复制到目标文件中,如果目标文件不存在,则在指定的路径中新建一个文件 void Move(string sourceFileName,string destFileName)

【UNIX环境高级编程】文件 IO 操作 - 基础函数 open close creat lseek write read 详解

博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) open 函数简介 open 函数解析 : -- 函数定义 : #include <fcntl.h> int open(const char *path, int oflag, ...); -- 函数作用 : 打开或者创建一个文件; -- 返回值 : 打开文件成功, 返回文件描述符; 如果失败, 返回

Linux命令行基本文件/文件夹操作

对文件的操作 创建空文件:   touch +文件名   # 一般是先touch好一个文件然后vim这个文件. 很好奇为什么叫touch.删除文件:  rm +文件名         # 直接就没了,不会到回收站 复制文件到指定位置: cp +文件 + 目标目录  # 例如 cp file sub 把当前目录下的file文件复制到了当前目录子目录sub里面.重命名/移动文件: mv +文件(文件夹) + 目标目录 # 例如 mv dir1 dir2/new 把文件夹dir1(及其内容)移动到了跟

Java 对文件的操作

public class ReadFile { /** * 按行读取文件操作 * @throws IOException */ public void readFile(String fileName) throws IOException{ //(1)File 类 File file = new File(fileName); // BufferedReader reader = null; try { //(2) 将文件放入到BufferedReader中 reader = new Buff

java实现客户端向服务器发送文件的操作

服务器源代码: import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket;

我的视频网站开通,第一个 ArcGIS文本文件,excel文件生成点操作发布,希望大家支持

网站地址:http://i.youku.com/gisoracle第一个学习视屏:ArcGIS文本文件,excel文件生成点操作http://v.youku.com/v_show/id_XNzM3NzIxODE2.html 我的视频网站开通,第一个 ArcGIS文本文件,excel文件生成点操作发布,希望大家支持,布布扣,bubuko.com

对文件的操作

以下是最近文件操作的总结,所以我把所有零碎的知识点写在了一起,比较乱! 对文件的操作,布布扣,bubuko.com

INI文件的操作(ASP.NET+C#)

INI文件的操作(ASP.NET+C#) (一)INIFile.cs using System; using System.Runtime.InteropServices; using System.Text; namespace CreateWebDir { /// <summary> /// INIFile 的摘要说明. /// </summary> public class INIFile { public string path; public INIFile(string