一:文件管理器 —NSFileManager
本小節主要說一下 NSFileManager 的defaultManager 方法,因爲這個方法使用單利模式寫的
廢話不多說,直接上代碼:
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//創建一個文件管理器,這節主要說的就是文件管理器的defaultManager方法,
//這是個單利模式的方法,後面我們會模仿一個
NSFileManager *fileManager1 = [NSFileManager defaultManager];
NSLog(@"fileManager1 的地址爲:%p",fileManager1);
NSFileManager *fileManager2 = [NSFileManager defaultManager];
NSLog(@"fileManager2 的地址爲:%p",fileManager2);
NSFileManager *fileManager3 = [[NSFileManager alloc]init];
NSLog(@"fileManager3 的地址爲:%p",fileManager3);
NSFileManager *fileManager4 = [NSFileManager defaultManager];
NSLog(@"fileManager4 的地址爲:%p",fileManager4);
//爲什麼上面的結果是哪個樣子的呢?沒有創建新的對象嗎?
//這是因爲defaultManager 是單利模式的方法,(兩個對象指向同一塊地址,就跟string中兩個對象指向同一塊地址一樣)
//我們來重新寫一個方法,搞清他的工作原理
//創建一個User類,來模仿他,我們寫一個方法叫做defaultUser的方法
/*
寫單利模式之前結果是不一樣的
User *u1 = [User defaultUser];
NSLog(@"u1的地址爲:%@",u1);
User *u2 = [User defaultUser];
NSLog(@"u2的地址爲:%@",u2);
*/
//寫好單利模式之後
User *u1 = [User defaultUser];
u1.age=10;
NSLog(@"u1的地址爲:%p",u1);
User *u2 = [User defaultUser];
NSLog(@"u2的age是不是10呢????請看結果:%i",u2.age);
NSLog(@"u2的地址爲:%p",u2);
User *u3 = [[User alloc]init];
NSLog(@"u3的地址爲:%p",u3);
//查看打印結果可以看出我們打印成功了
}
return 0;
}
自己模擬寫一個單利模式,創建一個User類,下面是user類的.h文件
#import <Foundation/Foundation.h>
@interface User : NSObject
@property(nonatomic,assign)int age;
+(User *)defaultUser;
@end
下面User類的.m文件,重點再這裏面:
#import "User.h"
@implementation User
//static 變量就是說,在整個程序沒有退出之前,只需要創建一次,就能夠一直的使用。
static User *instance = nil;
+(User *)defaultUser
{
if (instance == nil) {
instance = [[self alloc]init];
}
//return [[self alloc]init];單利模式之前
return instance;
}
@end
二:獲取文件屬性
文件屬性就是指:獲得文件創建時間,文件大小,文件修改時間等一些屬性;(右擊文件夾顯示簡介中會有)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
//我們先回憶一下NSString 是怎麼把數據寫進文件的
NSString *str = @"www.baidu.com";
NSString *path = @"/Users/renwenyi/Desktop/Text/text.txt";
NSError *error;
BOOL isWriteSuccess = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (isWriteSuccess) {
NSLog(@"創建成功");
}
else
{
NSLog(@"error");
}
*/
//1:獲取文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//文件屬性可右鍵文件夾點擊顯示簡介中查看,attribute屬性的意思
NSString *path = @"/Users/renwenyi/Desktop/Text/text.txt";
NSString *error;
NSDictionary *dict = [fileManager attributesOfItemAtPath:path error:&error];
if (error !=nil) {
NSLog(@"error 爲:%@",error);
}else
{
NSLog(@"dict 爲:%@",dict);
NSData *date = [dict objectForKey:NSFileCreationDate];
NSString *size = [dict objectForKey:NSFileSize];
NSData *dateModiy = [dict objectForKey:NSFileModificationDate];
NSLog(@"文件創建時間:%@,文件大小爲:%@,文件修改日期爲:%@",date,size,dateModiy);
}
}
return 0;
}
三:獲得文件目錄下的文件與子目錄列表
具體實現如下所示:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:首先要獲得文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/Text";
NSString *error;
//這個方法只能夠獲得目標目錄下第一級目錄,也就是說如果你的文件夾裏面還有文件夾,那麼這個第二層文件夾裏面的內容就不會再顯示出來了,只能顯示出你的第一層文件夾信息
NSArray *array = [fileManager contentsOfDirectoryAtPath:path error:&error];
NSLog(@"文件目錄下的內容爲:%@",array);
//2:如果我們想要顯示一個文件夾中的所有元素,(就是逐級所有子集的目錄)包括文件夾下的文件裏面東西,那麼就要用到下面這個方法
NSArray *array2 = [fileManager subpathsOfDirectoryAtPath:path error:&error];
NSLog(@"所有文件爲:%@",array2);
//如果是第二級目錄下的文件會在文件夾後面有個“/”,見圖解
}
return 0;
}
四:管理目錄
1:創建目錄
2:移動目錄
3:刪除目錄
4:copy內容
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:創建目錄
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/wenyiFloder/ccc";
NSString *error;
//withIntermediateDirectories YES表示它會自動的逐級進行創建目錄,NO表示只能創建一級目錄
BOOL isCreateSuccess = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
if (isCreateSuccess) {
NSLog(@"創建成功");
}
else
{
NSLog(@"創建失敗");
}*/
//2:移動目錄(相當於剪切操作,但是剪切的是文件夾中的東西,剪切的文件夾消失);
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/wenyiFloder";
NSString *path2 = @"/Users/renwenyi/Desktop/newwenyiFloder";
NSError *error ;
BOOL isMoveSuccess = [fileManager moveItemAtPath:path1 toPath:path2 error:&error];
if (isMoveSuccess) {
NSLog(@"移動成功");
}
else
{
NSLog(@"移動失敗");
}
*/
//3:刪除目錄
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/newwenyiFloder";
NSError *error;
//到回收站裏面了
BOOL isremoveSuccess = [fileManager removeItemAtPath:path error:&error];
if (isremoveSuccess) {
NSLog(@"刪除成功");
}
else
{
NSLog(@"刪除失敗");
}
*/
//4:copy 內容
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/wenyiFolder";
NSString *path2 = @"/Users/renwenyi/Desktop/newwenyiFolder";
NSError *error;
BOOL isCopySuccess = [fileManager copyItemAtPath:path1 toPath:path2 error:&error];
if (isCopySuccess) {
NSLog(@"copy成功");
}
else
{
NSLog(@"拷貝失敗 %@",error);
}
}
return 0;
}
五:管理文件
代碼中的文件用的是一張圖片
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:獲得一個文件,並根據它在創建一個文件
/*
NSString *path = @"/Users/renwenyi/Desktop/屏幕快照.png";
//NSData 只要是文件格式他都能讀取,eg:mp3,mp4,rmvb,mkv,pdf,doc,txt,都可以把這些當成一個文件
NSData *data = [NSData dataWithContentsOfFile:path];
NSLog(@"%ld",data.length);
//目標:把一個文件創建成一個新的文件(以上面的data爲例,把它當成一個文件)
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path2 = @"/Users/renwenyi/Desktop/屏幕快照2.png";
BOOL isCreateSuccess = [fileManager createFileAtPath:path2 contents:data attributes:nil];
if (isCreateSuccess) {
NSLog(@"創建成功");
}else
{
NSLog(@"創建失敗");
}
*/
//2:移動文件到指定的目錄,移動相當於剪切操作
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/12.png";
NSString *path2 = @"/Users/renwenyi/Desktop/456/123455.png";
NSString *error;
BOOL isMoveSuccess = [fileManager moveItemAtPath:path1 toPath:path2 error:&error];
if (isMoveSuccess) {
NSLog(@"移動成功");
}
else
{
NSLog(@"error %@",error);
}
*/
//3:刪除文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/123455.png";
NSError *error;
BOOL isRemoveSuccess = [fileManager removeItemAtPath:path1 error:&error];
if (isRemoveSuccess) {
NSLog(@"刪除成功");
}
else
{
NSLog(@"error %@",error);
}
}
return 0;
}
六:使用NSData處理數據
當我們用到音頻文件,文本文件,視頻文件的時候就必須要用到NSData數據類型
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:當我們用到音頻文件,文本文件,視頻文件的時候就必須要用到NSData數據類型
//先把一個字符串寫入桌面txt
/*
NSString *str = @"www.baidu.com";
NSString *path1 = @"/Users/renwenyi/Desktop/renwenyi.txt";
NSError *error;
[str writeToFile:path1 atomically:YES encoding:NSUTF8StringEncoding error:&error];
*/
//注意:NSData是一個不可變長度的Data類型,只能夠通過一次加載完成所有的數據
//把文件寫入到內存當中
/*
NSString *path = @"/Users/renwenyi/Desktop/renwenyi.txt";
NSData *data = [NSData dataWithContentsOfFile:path];
NSLog(@"data的長度:%ld",data.length);
//把寫入到內存中的文件,寫入指定的位置
NSString *path2 = @"/Users/renwenyi/Desktop/newrenwenyi.txt";
BOOL isWriteSuccess = [data writeToFile:path2 atomically:YES];
if (isWriteSuccess) {
NSLog(@"寫入成功");
}
else
{
NSLog(@"寫入失敗");
}
*/
//2:可變長度的Data類型NSMutableData
//當我們需要把多個NSData拼接成數據存儲的時候,就要想到使用NSMutable這個類型
NSString *str1 = @"皇上駕到1次";
NSString *str2 = @"皇上駕到2次";
NSString *str3 = @"愛卿平身...";
NSMutableData *muData = [[NSMutableData alloc]init];
//下面是寫入內存,相當於dataWithContents
NSData *d1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];
NSData *d2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];
NSData *d3 = [str3 dataUsingEncoding:NSUTF8StringEncoding];
//appendData 能夠把NSData對象加入到 muData 中
[muData appendData:d1];
[muData appendData:d2];
[muData appendData:d3];
NSString *path = @"/Users/renwenyi/Desktop/haoren.txt";
//writeToFile是NSData的方法,但是NSMutable繼承字NSData 所以可以調用,表示寫入到指定目錄下
BOOL isWriteSuccess = [muData writeToFile:path atomically:YES];
if (isWriteSuccess) {
NSLog(@"創建成功");
}
else
{
NSLog(@"創建失敗");
}
}
return 0;
}