IOS 文件操作(NSFileManager)

这个示例程序主要用到了IOS中的UIImageView、UIImagePickerViewController、UIImage、NSFileManager等知识,结合这些知识构成一个小的应用程序,主要功能是对相册图片进行读取、存储到指定文件夹、从指定文件夹读取出来。这方面的知识在正式项目中用的是比较多的。做Android开发中,经常会使用到将图片保存到SD卡和从SD卡读取图片的操作,相比于Android在这方面的操作,IOS要方便许多。


基本功能是从相册选取一张图片,选完后显示在界面的UIImageView控件中,点击保存到文件夹按钮后就将图片保存到Documents下的ImageFile文件夹中,以image.png命名。退出程序下次进来时,可以选择从文件夹读取图片,如果有则读取出来显示在UIImageView上,如果没有则提示文件不存在。

首先来看看最后效果:

·从相册选取图片后显示在界面上

这里对功能进行了一点改进,点击打开相册按钮后出来一个UIActionSheet操作选项框,可以选择是从相机获取图片还是从相册获取。代码也做出了一点修改。


·点击保存到文件夹按钮后提示信息


·点击读取图片按钮后的提示信息(图片不存在)

·如果存在则将图片显示出来


保存图片成功后,按照前一篇文章提到的方法,可以到Finder下查看文件信息:



下面是实现部分,首先看看布局文件:


下面是代码:

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate>
  3. @property (retain, nonatomic) IBOutlet UIImageView *imageView;
  4. @property (retain, nonatomic) UIButton *saveToFileButton;
  5. //打开相册
  6. - (IBAction)openAlbum:(id)sender;
  7. //从文件夹读取图片
  8. - (IBAction)readImage:(id)sender;
  9. @end
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate>

@property (retain, nonatomic) IBOutlet UIImageView *imageView;
@property (retain, nonatomic) UIButton *saveToFileButton;

//打开相册
- (IBAction)openAlbum:(id)sender;

//从文件夹读取图片
- (IBAction)readImage:(id)sender;

@end


下面是ViewController.m文件

  1. #import "ViewController.h"
  2. //保存到文件夹按钮的标签,选取图片前,这个按钮是隐藏的
  3. #define SAVE_BUTTON_TAG 101
  4. @interface ViewController ()
  5. @end
  6. @implementation ViewController
  7. @synthesize imageView = _imageView;
  8. @synthesize saveToFileButton = _saveToFileButton;
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12. //根据设置的tag获取按钮控件
  13. self.saveToFileButton = (UIButton *)[self.view viewWithTag:SAVE_BUTTON_TAG];
  14. //添加对象事件
  15. [self.saveToFileButton addTarget:self action:@selector(saveToFileBtnTapped:) forControlEvents:UIControlEventTouchUpInside];
  16. //设置为不可见
  17. self.saveToFileButton.hidden = YES;
  18. }
  19. - (void)viewDidUnload
  20. {
  21. [self setImageView:nil];
  22. [self setSaveToFileButton:nil];
  23. [super viewDidUnload];
  24. // Release any retained subviews of the main view.
  25. }
  26. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  27. {
  28. return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  29. }
  30. - (void)dealloc {
  31. [self.imageView release];
  32. [self.saveToFileButton release];
  33. [super dealloc];
  34. }
  35. - (IBAction)openAlbum:(id)sender {
  36. UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"相册", nil];
  37. [actionSheet showInView:self.view];
  38. [actionSheet release];
  39. }
  40. //从文件夹读取图片
  41. - (IBAction)readImage:(id)sender {
  42. NSString *imagePath = [self imageSavedPath:@"image.png"];
  43. NSFileManager *fileManager = [NSFileManager defaultManager];
  44. //判断文件是否存在
  45. if (![fileManager fileExistsAtPath:imagePath]) {
  46. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Note" message:@"文件不存在" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
  47. [alertView show];
  48. [alertView release];
  49. }else {
  50. //从指定目录读取图片
  51. UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
  52. self.imageView.image = image;
  53. }
  54. }
  55. //保存到文件按钮事件
  56. - (void)saveToFileBtnTapped:(id)sender {
  57. NSString *imagePath = [self imageSavedPath:@"image.png"];
  58. BOOL isSaveSuccess = [self saveToDocument:self.imageView.image withFilePath:imagePath];
  59. if (isSaveSuccess) {
  60. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
  61. [alertView show];
  62. [alertView release];
  63. }else {
  64. UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片失败" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
  65. [alertView show];
  66. [alertView release];
  67. }
  68. }
  69. //将选取的图片保存到目录文件夹下
  70. -(BOOL)saveToDocument:(UIImage *) image withFilePath:(NSString *) filePath
  71. {
  72. if ((image == nil) || (filePath == nil) || [filePath isEqualToString:@""]) {
  73. return NO;
  74. }
  75. @try {
  76. NSData *imageData = nil;
  77. //获取文件扩展名
  78. NSString *extention = [filePath pathExtension];
  79. if ([extention isEqualToString:@"png"]) {
  80. //返回PNG格式的图片数据
  81. imageData = UIImagePNGRepresentation(image);
  82. }else{
  83. //返回JPG格式的图片数据,第二个参数为压缩质量:0:best 1:lost
  84. imageData = UIImageJPEGRepresentation(image, 0);
  85. }
  86. if (imageData == nil || [imageData length] <= 0) {
  87. return NO;
  88. }
  89. //将图片写入指定路径
  90. [imageData writeToFile:filePath atomically:YES];
  91. return YES;
  92. }
  93. @catch (NSException *exception) {
  94. NSLog(@"保存图片失败");
  95. }
  96. return NO;
  97. }
  98. //根据图片名将图片保存到ImageFile文件夹中
  99. -(NSString *)imageSavedPath:(NSString *) imageName
  100. {
  101. //获取Documents文件夹目录
  102. NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  103. NSString *documentPath = [path objectAtIndex:0];
  104. //获取文件管理器
  105. NSFileManager *fileManager = [NSFileManager defaultManager];
  106. //指定新建文件夹路径
  107. NSString *imageDocPath = [documentPath stringByAppendingPathComponent:@"ImageFile"];
  108. //创建ImageFile文件夹
  109. [fileManager createDirectoryAtPath:imageDocPath withIntermediateDirectories:YES attributes:nil error:nil];
  110. //返回保存图片的路径(图片保存在ImageFile文件夹下)
  111. NSString * imagePath = [imageDocPath stringByAppendingPathComponent:imageName];
  112. return imagePath;
  113. }
  114. #pragma Delegate method UIImagePickerControllerDelegate
  115. //图像选取器的委托方法,选完图片后回调该方法
  116. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
  117. {
  118. if (image != nil) {
  119. //选定照片后在界面显示照片并把保存按钮设为可见
  120. self.imageView.image = image;
  121. self.saveToFileButton.hidden = NO;
  122. }
  123. //关闭图像选择器
  124. [self dismissModalViewControllerAnimated:YES];
  125. }
  126. -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
  127. {
  128. //获取图片选取器
  129. UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
  130. //指定代理
  131. imagePicker.delegate = self;
  132. //打开图片后允许编辑
  133. imagePicker.allowsEditing = YES;
  134. //判断图片源的类型
  135. if (buttonIndex == 0) {
  136. if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
  137. //相机
  138. imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
  139. }
  140. }else if (buttonIndex == 1) {
  141. if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
  142. //图片库
  143. imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  144. }
  145. // if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
  146. // //相册
  147. // imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
  148. // }
  149. }else if (buttonIndex == [actionSheet cancelButtonIndex]) {
  150. return;
  151. }
  152. //打开图片选择模态视图
  153. [self presentModalViewController:imagePicker animated:YES];
  154. [imagePicker release];
  155. }
  156. @end
#import "ViewController.h"
//保存到文件夹按钮的标签,选取图片前,这个按钮是隐藏的
#define SAVE_BUTTON_TAG 101

@interface ViewController ()

@end

@implementation ViewController
@synthesize imageView = _imageView;
@synthesize saveToFileButton = _saveToFileButton;

- (void)viewDidLoad
{
    [super viewDidLoad];
    //根据设置的tag获取按钮控件
    self.saveToFileButton = (UIButton *)[self.view viewWithTag:SAVE_BUTTON_TAG];
    //添加对象事件
    [self.saveToFileButton addTarget:self action:@selector(saveToFileBtnTapped:) forControlEvents:UIControlEventTouchUpInside];
    //设置为不可见
    self.saveToFileButton.hidden = YES;
}

- (void)viewDidUnload
{
    [self setImageView:nil];
    [self setSaveToFileButton:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)dealloc {
    [self.imageView release];
    [self.saveToFileButton release];
    [super dealloc];
}

- (IBAction)openAlbum:(id)sender {
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"相册", nil];
    [actionSheet showInView:self.view];
    [actionSheet release];
}

//从文件夹读取图片
- (IBAction)readImage:(id)sender {
    NSString *imagePath = [self imageSavedPath:@"image.png"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //判断文件是否存在
    if (![fileManager fileExistsAtPath:imagePath]) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Note" message:@"文件不存在" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];
        [alertView release];
    }else {
        //从指定目录读取图片
        UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
        self.imageView.image = image;
    }
}

//保存到文件按钮事件
- (void)saveToFileBtnTapped:(id)sender {
    NSString *imagePath = [self imageSavedPath:@"image.png"];
    BOOL isSaveSuccess = [self saveToDocument:self.imageView.image withFilePath:imagePath];
    
    if (isSaveSuccess) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片成功" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];
        [alertView release];
    }else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"操作结果" message:@"保存图片失败" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];
        [alertView release];
    }
}

//将选取的图片保存到目录文件夹下
-(BOOL)saveToDocument:(UIImage *) image withFilePath:(NSString *) filePath
{
    if ((image == nil) || (filePath == nil) || [filePath isEqualToString:@""]) {
        return NO;
    }
    
    @try {
        NSData *imageData = nil;
        //获取文件扩展名
        NSString *extention = [filePath pathExtension];
        if ([extention isEqualToString:@"png"]) {
            //返回PNG格式的图片数据
            imageData = UIImagePNGRepresentation(image);
        }else{
            //返回JPG格式的图片数据,第二个参数为压缩质量:0:best 1:lost
            imageData = UIImageJPEGRepresentation(image, 0);
        }
        if (imageData == nil || [imageData length] <= 0) {
            return NO;
        }
        //将图片写入指定路径
        [imageData writeToFile:filePath atomically:YES];
        return  YES;
    }
    @catch (NSException *exception) {
        NSLog(@"保存图片失败");
    }
    
    return NO;
    
}

//根据图片名将图片保存到ImageFile文件夹中
-(NSString *)imageSavedPath:(NSString *) imageName
{
    //获取Documents文件夹目录
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [path objectAtIndex:0];
    //获取文件管理器
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //指定新建文件夹路径
    NSString *imageDocPath = [documentPath stringByAppendingPathComponent:@"ImageFile"];
    //创建ImageFile文件夹
    [fileManager createDirectoryAtPath:imageDocPath withIntermediateDirectories:YES attributes:nil error:nil];
    //返回保存图片的路径(图片保存在ImageFile文件夹下)
    NSString * imagePath = [imageDocPath stringByAppendingPathComponent:imageName];
    return imagePath;
}

#pragma Delegate method UIImagePickerControllerDelegate
//图像选取器的委托方法,选完图片后回调该方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
    if (image != nil) {
        //选定照片后在界面显示照片并把保存按钮设为可见
        self.imageView.image = image;
        self.saveToFileButton.hidden = NO;
    }
    //关闭图像选择器
    [self dismissModalViewControllerAnimated:YES];
}

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //获取图片选取器
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    //指定代理
    imagePicker.delegate = self;
    //打开图片后允许编辑
    imagePicker.allowsEditing = YES;
    
    //判断图片源的类型
    if (buttonIndex == 0) {
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            //相机
            imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        }
    }else if (buttonIndex == 1) {
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
            //图片库
            imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        }
//        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
//            //相册
//            imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
//        }
    }else if (buttonIndex == [actionSheet cancelButtonIndex]) {
        return;
    }
    
    //打开图片选择模态视图
    [self presentModalViewController:imagePicker animated:YES];
    [imagePicker release];

}

@end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值