首页 > 代码库 > ObjectiveC 文件操作二

ObjectiveC 文件操作二

10,文件委托,以便操作文件。头部看起来像是这样。

@interface MyFileManager : NSObject

@property(strong)NSFileManager *fileManager;

@end

.m文件

#import "MyFileManager.h"

@implementation MyFileManager

@synthesize fileManager;

@end

可以在头部引入接口。

#import <Foundation/Foundation.h>

@interface MyFileManager : NSObject<NSFileManagerDelegate>

@property(strong)NSFileManager *fileManager;

@end

MyFileManager里面的可选方法。是否能复制

- (BOOL)fileManager:(NSFileManager *)fileManager shouldCopyItemAtPath:(NSString *)srcPath  toPath:(NSString *)dstPath{

    if([dstPath hasPrefix:@"/Users/Shared/Book/Protected"]){

        NSLog(@"We cannot copy files into the protected folder and so this file was not copied");

        return NO;

    }

    else{

        NSLog(@"We just copied a file successfully");

        return YES;

    }

 

}

重写初始化方法

 

- (id)init {

    self = [super init];

    if (self) {

        self.fileManager = [[NSFileManager alloc] init];

        self.fileManager.delegate = self;

    }

    return self;

}

在main.m里面使用刚刚创建的类。

#import <Foundation/Foundation.h>

#import "MyFileManager.h"

 

int main (int argc, const char * argv[])

{

    

    @autoreleasepool {

        MyFileManager *myFileManager = [[MyFileManager alloc] init];

        

        NSString *protectedDirectory = @"/Users/Shared/Book/Protected";

        

        NSString *cacheDirectory = @"/Users/Shared/Book/Cache";

        

        NSString *fileSource = @"/Users/Shared/Book/textfile.txt";

        

        NSString *fileDestination1 = @"/Users/Shared/Book/Protected/textfile.txt";

        

        NSString *fileDestination2 = @"/Users/Shared/Book/Cache/textfile.txt";

        

        NSError *error = nil;

        

        NSArray *listOfFiles;

        

        NSLog(@"Look at directories BEFORE attempting to copy");

        

        listOfFiles = [myFileManager.fileManager contentsOfDirectoryAtPath:protectedDirectory

                                                                     error:&error];

        

        NSLog(@"List of files in protected directory (before):%@", listOfFiles);

        

        listOfFiles = [myFileManager.fileManager contentsOfDirectoryAtPath:cacheDirectory

                                                                     error:&error];

        

        NSLog(@"List of files in cache directory (before):%@", listOfFiles);

        

        

        //Attempt to copy into protected folder:

        BOOL fileCopied1 = [myFileManager.fileManager copyItemAtPath:fileSource

                                                              toPath:fileDestination1

                                                               error:&error];

        

        if(error)

            NSLog(@"There was an error, %@.  fileCopied1 = %i", error, fileCopied1);

        

        //Attempt to copy into cache folder:

        BOOL fileCopied2 =  [myFileManager.fileManager copyItemAtPath:fileSource

                                                               toPath:fileDestination2

                                                                error:&error];

        

        if(error)

            NSLog(@"There was an error, %@.  fileCopied2 = %i", error, fileCopied2);

        

        NSLog(@"Look at directories AFTER attempting to copy");

        

        listOfFiles = [myFileManager.fileManager contentsOfDirectoryAtPath:protectedDirectory

                                                                     error:&error];

        

        NSLog(@"List of files in protected directory (after):%@", listOfFiles);

        

        listOfFiles = [myFileManager.fileManager contentsOfDirectoryAtPath:cacheDirectory

                                                                     error:&error];

        

        NSLog(@"List of files in cache directory (after):%@", listOfFiles);

        

        

    }

    return 0;

}

 

此例子简单说明了委托方法的应用。

11,

使用文件或其他来源的数据。

组合字符串并写入文件。

NSUInteger length = 3;

char bytes1[length];

bytes1[0] = ‘A‘;

bytes1[1] = ‘B‘;

bytes1[2] = ‘C‘;

char bytes2[length];

bytes2[0] = ‘D‘;

bytes2[1] = ‘E‘;

bytes2[2] = ‘F’;

声明可变数组。

NSMutableData *mutableData = http://www.mamicode.com/[[NSMutableData alloc] init];

可变数组有很多方法,具体参考手册。

下面是代码。

NSUInteger length = 3;

        

        char bytes1[length];

        bytes1[0] = ‘A‘;

        bytes1[1] = ‘B‘;

        bytes1[2] = ‘C‘;

        

        for (int i=0;i<sizeof(bytes1);i++)

            NSLog(@"bytes1[%i] = %c", i, bytes1[i]);

        

        char bytes2[length];

        bytes2[0] = ‘D‘;

        bytes2[1] = ‘E‘;

        bytes2[2] = ‘F‘;

        

        for (int i=0;i<sizeof(bytes2);i++)

            NSLog(@"bytes2[%i] = %c", i, bytes2[i]);

        

        NSMutableData *mutableData = http://www.mamicode.com/[[NSMutableData alloc] init];

        

        [mutableData appendBytes:bytes1

                          length:length];

        

        [mutableData appendBytes:bytes2

                          length:length];

        

        NSLog(@"mutableData = http://www.mamicode.com/%@", mutableData);

        

        char *bytesFromData = http://www.mamicode.com/(char *)[mutableData bytes];

        

        for (int i=0;i<length*2;i++)

            NSLog(@"bytesFromData[%i] = %c", i, bytesFromData[i]);

        

        NSError *error = nil;

        

        BOOL dataSaved = [mutableData writeToFile:@"/Users/Shared/Book/datadump.txt"

                                          options:NSDataWritingAtomic

                                            error:&error];

        

        if(dataSaved)

            NSLog(@"mutableData successfully wrote contents to file system");

        else

 

            NSLog(@"mutableData was unsuccesful in writing out data because of %@", error);

12,NSCache缓存数据。

比如创建一个ViewController类。

.h文件里面

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong) NSCache *cache;

@property (assign) BOOL regularLogo;

@property (strong) UIImageView *myImageView;

@property (strong) UIButton *loadImageButton;

- (void)presentImage;

@end

.m文件里面

#import "ViewController.h"

@implementation ViewController

-(void)viewDidLoad{

    [super viewDidLoad];

    //set up the cache

    self.cache = [[NSCache alloc] init];

} @end

只要试图被激活就可以使用缓存。

下面是具体代码。

Listing 4-14. AppDelegate.h #import <UIKit/UIKit.h>

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end

Listing 4-15. AppDelegate.m #import "AppDelegate.h"

#import "ViewController.h"

@implementation AppDelegate

@synthesize window = _window;

@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application?? didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Override point for customization after application launch.

    self.viewController = [[ViewController alloc]

initWithNibName:@"ViewController"?? bundle:nil];

    self.window.rootViewController = self.viewController;

    [self.window makeKeyAndVisible];

    return YES;

} @end

Listing 4-16. ViewController.h #import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (strong) NSCache *cache;

@property (assign) BOOL regularLogo;

@property (strong) UIImageView *myImageView;

@property (strong) UIButton *loadImageButton;

- (void)presentImage;

@end

Listing 4-17. ViewController.m #import "ViewController.h"

@implementation ViewController

@synthesize cache, regularLogo, myImageView, loadImageButton;

-(void)viewDidLoad{

    [super viewDidLoad];

    //Change the view‘s background color to white

    self.view.backgroundColor = [UIColor whiteColor];

    //Load the regular logo first

    self.regularLogo = YES;

 //set up the cache

    self.cache = [[NSCache alloc] init];

    //Setup the button

    self.loadImageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    self.loadImageButton.frame = CGRectMake(20, 415, 280, 37);

    [self.loadImageButton addTarget:self

                             action:@selector(presentImage)

                   forControlEvents:UIControlEventTouchUpInside];

    [loadImageButton setTitle:@"Present Image" forState:UIControlStateNormal];

    [self.view addSubview:loadImageButton];

    //Setup the UIImageView

    self.myImageView = [[UIImageView alloc] init];

    self.myImageView.frame = CGRectMake(0, 0, 320, 407);

    self.myImageView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view addSubview:self.myImageView];

}

- (void)presentImage{

    if(regularLogo){

        NSString *key = @"regular-logo";

        NSPurgeableData *data = http://www.mamicode.com/[cache objectForKey:key];

        if(!data){

            NSString *bundlePath = [[NSBundle mainBundle] bundlePath];

NSString *imagePath = [NSString stringWithFormat:?? @"%@/MobileAppMastery-Log.png", bundlePath];

            data = http://www.mamicode.com/[NSPurgeableData dataWithContentsOfFile:imagePath];

            [cache setObject:data forKey:key];

            NSLog(@"Retrieved resource(%@) and added to cache", key);

} else

            NSLog(@"Just retrieved resource(%@)", key);;

        self.myImageView.image = [UIImage imageWithData:data];

        regularLogo = NO;

} else{

        NSString *key = @"greyscale-logo";

        NSPurgeableData *data = http://www.mamicode.com/[cache objectForKey:key];

        if(!data){

            NSString *bundlePath = [[NSBundle mainBundle] bundlePath];

NSString *imagePath = [NSString? stringWithFormat:@"%@/MAM_Logo_Square_No_Words_Grayscale.png", bundlePath];

            data = http://www.mamicode.com/[NSPurgeableData dataWithContentsOfFile:imagePath];

            [cache setObject:data forKey:key];

            NSLog(@"Retrieved resource(%@) and added to cache", key);

} else

            NSLog(@"Just retrieved resource(%@)", key);

self.myImageView.image = [UIImage imageWithData:data];

        regularLogo = YES;

    }

} @end