最近公司要做APP的统计,这就需要将APP中的统计数据记录到本地文件中,最后统一上传,下面就是关于本地文件的增删改查的一些操作的详解。
首先,要知道iOS沙盒模型存放文件的文件夹Documents,temp,Library,Application。
1 . Documents 目录:所有的应用程序数据文件写入到这个目录下,这个目录用于存储用户数据或其他应该定期备份的信息。
2 . Application - Name 目录:这事应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以在运行时不能对这个目录的内容进行修改,否则可能会使应用程序无法启动。
3 . Library 目录:这个目录下面有两个子目录:Caches 和 Preferences
Preferences 目录:包含应用程序的偏好设置文件。不应该直接创建偏好设置文件,而是应该使用NSUserDefault类来取得和设置应用程序的偏好。
Caches 目录:用于存放应用程序临时文件,保存应用程序再次启动过程中不需要的信息,如NSUserDefaults中保存的信息。
获取这些目录路径的方法:
1、获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2、获取Documents目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3、获取Caches目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4、获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();
主要的操作是在Documents里面的相关文件的操作:
1、在Docunments里面创建一个文件夹路径
NSString *path = [NSString stringWithFormat:@"%@/%@/",docDir,@"Ver"];
在Ver文件夹里面写文件路径
NSString *txtPath = [path stringByAppendingPathComponent:@"version.txt"];
写入文件内容
NSString *verContent = @"abc";
NSFileManager *verfileManager = [[NSFileManager alloc]init];
if (![verfileManager fileExistsAtPath:txtPath]) {
//路径存在与否
if (![verfileManager fileExistsAtPath:path]) {
//文件夹路径存在与否
[verfileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
}
NSData *txtData = [verContent dataUsingEncoding:NSUTF8StringEncoding];
[verfileManager createFileAtPath:txtPath contents:txtData attributes:nil];
}
2、读取文件内容
NSData *txtCon = [NSData dataWithContentsOfFile:txtPath];
NSString *dataStr = [[NSString alloc]initWithData:txtCon encoding:NSUTF8StringEncoding];
3、拷贝文件
NSError* error=nil;
[verfileManager copyItemAtPath:riginFile toPath:themepath error:&error];
// 两个path均是文件的路径,不是文件夹的路径;并且同样路径的(相同的文件名称)不会复制成功,所以要原来的文件,将新文件添加进来。
移除: - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **) error;
4、比较文件内容
- (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2;
NSString类路径的处理方法
文件路径的处理
NSString *path = @"/Uesrs/apple/testfile.txt"
- 常用方法如下
获得组成此路径的各个组成部分,结果:(”/”,”User”,”apple”,”testfile.txt”)
- (NSArray *)pathComponents;
提取路径的最后一个组成部分,结果:testfile.txt
- (NSString *)lastPathComponent;
删除路径的最后一个组成部分,结果:/Users/apple
- (NSString *)stringByDeletingLastPathCpmponent;
将path添加到先前路径的末尾,结果:/Users/apple/testfile.txt/app.txt
- (NSString *)stringByAppendingPathConmponent:(NSString *)str;
去路径最后部分的扩展名,结果:text
- (NSString *)pathExtension;
删除路径最后部分的扩展名,结果:/Users/apple/testfile
- (NSString *)stringByDeletingPathExtension;
路径最后部分追加扩展名,结果:/User/apple/testfile.txt.jpg
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
- 移动文件(重命名)
NSString *toPath = [NSHomeDirectory( ) stringByAppendingPathComponent:@"hellogod/New Testament.txt"];
[fm createDirectoryAtPath:[toPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
NSError *error;
BOOL isSuccess = [fm moveItemAtPath:filePath toPath:toPath error:&error];
- 复制文件(重命名)
NSString *copyPath = [NSHomeDirectory( ) stringByAppendingPathComponent:@"备份/Old Testament.txt"];
[fm createDirectoryAtPath:[toPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];
BOOL success = [fm copyItemAtPath:toPath toPath:toPath error:nil];
- 删除文件、获取文件大小
- 判断文件是否存在和删除文件
if([fm fileExistsAtPath])
{
if ([fm removeItemAtPath:copyPath])
{
NSLog(@"remove success");
}
}
- 获取文件大小
NSFileManager *fileManager = [NSFileManager defaultManager];
获得文件的属性字典
NSDictionary *attrDic = [fileManager attributesOfItemAtpath:sourcePath error:nil];
NSNumber *fileSize = [attrDic objectForKey:NSFileSize];
- 获取目录文件信息
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *enuPath = [NSHomeDirectoty( ) stringByAppendingPathComponent:@"Test"];
NSDictionaryEnumerator *dirEnum = [fileManager enumeratorAtPath:enuPath];
NSString *path = nil;
while ((path = [dirEnum nextObject]} != nil)
{
NSLog(@"%@",path);
}
下面这些内容是关于在已经创建好的文件将特定的字符串写入到其中,追加而不是覆盖,直接上代码!
- (void)writefile:(NSString *)string
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *homePath = [paths objectAtIndex:0];
NSString *filePath = [homePath stringByAppendingPathComponent:@"testfile.text"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:filePath]) //如果不存在
{
NSString *str = @"姓 名/手 机 号/邮 件";
[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
[fileHandle seekToEndOfFile]; //将节点跳到文件的末尾
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *datestr = [dateFormatter stringFromDate:[NSDate date]];
NSString *str = [NSString stringWithFormat:@"\n%@\n%@",datestr,string];
NSData* stringData = [str dataUsingEncoding:NSUTF8StringEncoding];
[fileHandle writeData:stringData]; //追加写入数据
[fileHandle closeFile];
}
总结
读取文件类和常用方法:
NSFileHandle类主要对文件内容进行读取和写入操作
NSFileManager类主要对文件的操作(删除、修改、移动、复制等等)
常用处理方法:
+ (id)fileHandleForReadingAtPath:(NSString *)path //打开一个文件准备读取
+ (id)fileHandleForWritingAtPath:(NSString *)path //打开一个文件准备写入
+ (id)fileHandleForUpdatingAtPath:(NSString *)path //打开一个文件准备更新
- (NSData *)availableData; //从设备或通道返回可用的数据
- (NSData *)readDataToEndOfFile; //从当前的节点读取到文件的末尾
- (NSData *)readDataOfLength:(NSUInteger)length; //从当前节点开始读取指定的长度数据
- (void)writeData:(NSData *)data; //写入数据
- (unsigned long long)offsetInFile; //获取当前文件的偏移量
- (void)seekToFileOffset:(unsigned long long)offset; //跳到指定文件的偏移量
- (unsigned long long)seekToEndOfFile; //跳到文件末尾
- (void)truncateFileAtOffset:(unsigned long long)offset; //将文件的长度设为offset字节
- (void)closeFile; 关闭文件