您的位置:首页 > 其它

文件管理者NSFileManager && 写入文件存储 &&字符串操作 && NSInputStream

2016-03-10 00:47 357 查看
1.文件管理器
文件管理器:NSFileManager
//创建单例 f1 [NSFileManager defaultManager];
NSFileManager *f1 = [NSFileManager defaultManager];
NSLog(@“%p”,f1); //p输出地址

NSFileManager *f2 = [NSFileManager defaultManager];
NSLog(@“%p”,f2);
这里输出的地址一样,所以证明了创建的是一个单例

NSFileManager *f3 = [[NSFileManager alloc]init];
如果用这种方式创建则创建出来的是不同的对象,不是单例

//静态变量,整个程序运行完成的时候才会被释放掉
static User *instance = nil;

+ (User *)defaultUser
{
if (instance == nil)
{
instance = [[self alloc]init];
}
return instance;
}

先创建一个文件夹
NSString *str =
@"这是我创建的文件";
NSError *error;
BOOL isWriteSuccess = [str
writeToFile:@"/Users/qianfeng/Desktop/我的文件.txt"
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
if (isWriteSuccess) {
NSLog(@"创建成功");
} else {
NSLog(@"error %@",error);
}

获取文件属性
1.获取文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
2.获取文件属性
NSString *path = @"/Users/qianfeng/Desktop/我的文件.txt";
NSError *error;
NSFileManager *fileManager = [NSFileManager
defaultManager];
//获取文件信息(属性和权限)
NSDictionary *dic = [fileManager attributesOfItemAtPath:path error:&error];

if (error ==
nil) {
//获取文件创建日期
NSDate *date = [dic objectForKey:NSFileCreationDate];
}

文件管理器续:
1.获取目录下的文件与子文件目录列表:
NSFileManager *fileManager = [NSFileManager
defaultManager];
NSString *path =
@"/Users/qianfeng/Desktop/10月26今日所学";
NSError *error;
//只能获得目标目录下的第一级目录
NSArray *array1 = [fileManager
contentsOfDirectoryAtPath:path
error:&error];
//能逐级获得目标目录下的所有子目录
NSArray *array2 = [fileManager
subpathsOfDirectoryAtPath:path
error:&error];

2.管理目录
1)创建目录
NSFileManager *fileManager = [NSFileManager
defaultManager];
NSString *path =
@"/Users/qianfeng/Desktop/新建问佳佳/QQQQ";
NSError *error;
//YES时,是逐级创建文件夹.NO时,只能创建一级目录
BOOL isCreateSuccess = [fileManager
createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (isCreateSuccess) {
NSLog(@"目录创建成功");
} else {
//注意这里是error,不是&error
NSLog(@"error:%@",error);
}
2)移动目录(剪切操作)
NSFileManager *fileManager = [NSFileManager
defaultManager];
NSString *path =
@"/Users/qianfeng/Desktop/新建问佳佳";
NSString *pathto =
@"/Users/qianfeng/Desktop/new";
NSError *error;
BOOL isMoveSuccess = [fileManager
moveItemAtPath:path toPath:pathto
error:&error];
if (isMoveSuccess) {
NSLog(@"移动成功");
} else {
NSLog(@"error:%@",error);
}
3)删除目录
removeItemAtPath:error:
4)拷贝文件
copyItemAtPath: toPath: error:

3.管理文件
1)获得文件 创建文件
NSString *path0 = @"/Users/qianfeng/Desktop/新建0.png";
//无论什么格式都能转化为NSData数据类型,mp4,mp3,text,doc等等
NSData *data = [NSData
dataWithContentsOfFile:path0];
NSLog(@"data的大小(字节数)==%ld",data.length);//测试写入是否成功

NSFileManager *fileManager = [NSFileManager
defaultManager];
NSString *path1 =
@"/Users/qianfeng/Desktop/新建1.png";
BOOL isCreateSuccess = [fileManager
createFileAtPath:path1 contents:data
attributes:nil];
if (isCreateSuccess) {
NSLog(@"创建文件成功");
} else {
NSLog(@"创建失败");
}
2)移动文件(同上)
3)删除文件(同上)

使用NSData处理数据:(加载数据如视频音频文本文件等)

NSData是不可变长度的类型数据,只能通过一次加载完成所有数据
NSString *path0 =
@"/Users/qianfeng/Desktop/新建0.txt";
//把目标路径文件中的内容转化成NSData类型,加载(存储)到内存中
NSData *data = [NSData
dataWithContentsOfFile:path0];
NSString *path1 =
@"/Users/qianfeng/Desktop/新建1.txt";
//写入到指定文件中
BOOL isWriteSuccess = [data
writeToFile:path1 atomically:YES];
if (isWriteSuccess) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败");
}

NSMutableData:
如果将多个字符串写入文件中,则先将每一个字符串转化为NSData类型,然后拼接到mutableData上,将mutableData 写入文件中.或者先拼接成一个字符串,然后再做。
如:NSString *str1 =
@"ddddsfds";
NSMutableData *mutabelData = [[NSMutableData
alloc]init];
NSData *data1 = [str1
dataUsingEncoding:NSUTF8StringEncoding];
[mutabelData appendData:data1];

格式化日期操作:

1.//获得日期对象
这里是当前日期
NSDate *date = [NSDate
date];
NSLog(@"date == %@",date);

2.比较两个日期是否相同
3.格式化日期
NSDate *date = [NSDate
date];
//格式化日期对象
NSDateFormatter *dataFormatter = [[NSDateFormatter
alloc]init];
//2015-10-29 13:08:51
[dataFormatter setDateFormat:@"qqqq-ww-ee hh:mm:ss"];
//把格式与日期关联起来
NSString *str = [dataFormatter
stringFromDate:date];
4.将字符串转换成日期
5.处理时区问题

//为什么要使用枚举?
//有一些简单的数据,既不方便使用基础类型存储,也不方便封装为结构体,就可以使用枚举

结构体是将相同的或不同类型的数据封装到一起生成新的数据结构

.h是头文件,不是用来编译的,只是用来拷贝的。.m文件才是源代码文件,才是用来编译的

类的本质:
类本身也是一个对象,是Class类型的对象,简称类对象。类对象 == 类
类名就代表类对象,每个类只有一个类对象
实例对象:用类创建出来的对象

例如:
Person *p = [[Person alloc]init];
//获取内存中的类对象
Class c = [p class]; //class Xcode会提示返回一个Class类型的数据 //这里不要加*号,因为本身就有(官方文档中)
Class c1 = [Person class];

1.当程序启动时,就会加载项目中所有的类和分类,而且加载后回调用每个类和分类的+load方法,只会调用一次
2.当第一次使用某个类时,就会调用当前类的+initialize方法
3.(+load)先加载父类,再加载子类。(+initialize)先初始化父类,再初始化子类。

默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址> 内存地址就是对象地址
NSLog(@“%@”,p);
1.会调用对象p的- description方法
2.拿到-description方法的返回值(NSString *)显示到屏幕上
3.-description方法默认返回的是 :<类名:内存地址>
如果想要拿到对象p的属性,就要重写-description方法

NSLog相关:
Person *p = [[Person alloc]init];
//指针变量的地址
NSLog(@“%@”,&p);
//对象的地址
NSLog(@“%@”,p);

//输出当前函数名
NSLog(@“%s”,__func__);

2.什么是SEL?
SEL:其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法。
发消息就是发送SEL,消息就是SEL
1.方法的存储位置:
每个类的方法列表都存储在类对象中
每个方法都有一个与之相对应的SEL类型的对象
根据一个SEL对象就可以找到方法的地址,进而调用方法

2.SEL对象的创建: SEL s = @selector(text);
SEL s2 = NSSelectorFromString(@“text”);
SEL 本身就有*号(官方文档中)
SEL 类型(int)
1. 是一个OC类型
2. self 封装了消息,即函数
3. 一般使用 performSelector:调用
ResponseToSelector: 调用前判断调用方法是否存在
4. @selector() 方法选择器

设计模式:代理模式?观察者模式?

NSObject是一个基类,也是一个基协议
一个协议遵守了另外一个协议,就可以拥有另一个协议的所有方法声明
@protocol
1.基本用途
可以用来声明一大堆方法,不能声明成员变量
只要某个类遵守了这个协议,就相当于拥有了这个协议中的所有方法的声明
只要父类遵守了某个协议,就相当于子类也遵守了
2.例如要求obj3 保存的对象必须是遵守MyProtocol这个协议
NSObject<MyProtocol> *obj3 = [[Person alloc]init]; //这里Person类遵守了MyProtocol协议的
id<MyProtocol> obj3 = [[Person alloc]init]; //等价上面
@property (nonatomic,strong) id<MyProtocol> obj3;
3.协议可以定义在单独的.h文件中,也可以定义在某个类中
如果这个协议只用在某个类中,应该把协议定义在该类中
如果这个协议用在很多类中,就应该定义在单独文件中

我要给他发消息,就要调用他的方法就可以了,我拿到他方法的返回值给我,就是反馈

二、

/** 将字符串写入文件

* //写入文件

NSString *str00 = @"hello world";
//如果文件前面的路径存在,而这个要写入的文件开始时并不存在,那么写入字符串时,会自动创建一个文件,并将内容写入这个文件中。如果文件存在,直接将内容写入文件并将覆盖原本文件中的内容。如果写入文件之前的路径也不存在,写入失败,不会自动创建不存在的文件夹
NSString *filePath = @"/Users/liweiguo/Desktop/字符串文件/写入文件2.txt";
//atomic,原子操作 noatomic,非原子操作
//YES时,向文件写入字符串的过程中,会先创建一个临时的文件,字符串会先临时写入到这个临时的文件中,如果在写入过程中,没有中断(完成写入成功),这个临时文件的内容就会最终移到我们要写入的文件中,然后将临时文件删除;如果在往临时文件里写入内容的过程中,写入发生中断,不会将之前写入到临时文件中的未完成的这部分内容移入到要写入的文件中,而直接将临时文件删除。
//NO时,不会创建一个临时文件,而是直接往要写入的文件里面写内容,如果写入中途发生中断,文件里面会有一份写入的不完整的内容
[str00 writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str00: %@", str00);

//写入URL
//将本地文件路径转换成url
NSURL *url = [NSURL fileURLWithPath:filePath];
[@"hi everyOne" writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSString *str00 = @"hello";
NSString *str01 = @"Hello";

//判断两个字符串内容是否一样
if ([str00 isEqualToString:str01]) {
NSLog(@"内容一样");
}
else{
NSLog(@"内容不一样");
}

//判断两个字符串地址是否相同,如果地址相同,那么内容一定相同
if (str00 == str01) {
NSLog(@"地址相同");
}
else{
NSLog(@"地址不相同");
}

*/

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是可以异步工作的。可以注册一个在流中有字节可读的时候回调的函数,如果没有可读的,就不要阻塞住,回调出去。
Baidu Button BEGIN
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: