2015-10-07 09:03:08 senwin2009 阅读数 1322

NSFileManager代表文件管理器。当开发者使用NSFileManager执行移动 ,复制,链接,删除文件或目录 时,程序可以为 NSFileManager提供配套的事件委托(实现了 NSFileManagerDelegate 协议的对象),该委托对象用于 确保移动 ,复制,链接,删除操作的成功过完成,并为前面的几种操作提供相应的处理方法。

NSFileManager采用文件名作为文件的唯一标识。每个文件名都是一个普通的 NSString 对象,它既可是 绝对路径,也可以是相对路径。

(Mac 系统下的)绝对路径与相对路径

相对路径:不以斜线开头的路径 都是相对路径。如,code/abc.m 代表,当前路径下code目录下的 abc.m 文件。相对路径都是以当前路径作为基础路径。——随着当前路径的变化,同一个相对路径实际代表的文件可能发生变化,,在终窗口输入 pwd 命令,既可看到 当前路径。
绝对路径:以 斜线(代表 根目录)开头的路径。绝对路径是唯一的 。它代表的文件/目录总是固定的。比如:/Users/abc,代表根目录下Users目录下的 abc 子目录。

MAC OS X 中 包括的几种特殊路径:

~:代表当前用户的Home 目录。for example:
- 当前用户为 albert, 那么~就代表 /Users/ albert;
- 还可以写成 :~xyz,代表 xyz 用户的 Home 目录 ,即 /Users/ xyz;

.:代表当前目录。
..: 代表当前目录的上一级目录。

NSFileManager访问文件属性 和内容

程序可以调用NSFileManager的defaultManager 类方法来获取系统默认的NSFileManager对象,一旦获取了NSFileManager对象,,就可以调用NSFileManager的方法操作系统的文件项目。

示例代码:
NSFileManagerTest.m

#import <Foundation/Foundation.h>

int main(int argc , char * argv[])
{
    @autoreleasepool{
        NSFileManager* fm = [NSFileManager defaultManager];
        // 将会输出代表真的1
        NSLog(@"NSFileManagerTest.m是否存在:%d", 
            [fm fileExistsAtPath:@"NSFileManagerTest.m"]);

        BOOL isDir;
        NSLog(@"NSFileManagerTest.m是否存在:%d", 
            [fm fileExistsAtPath:@"NSFileManagerTest.m"
            isDirectory: &isDir]);
        // 将会输出代表假的0
        NSLog(@"NSFileManagerTest.m是否为目录:%d", isDir);
        // 将会输出代表真的1
        NSLog(@"NSFileManagerTest.m是否为可读文件:%d", 
            [fm isReadableFileAtPath:@"NSFileManagerTest.m"]);
        // 将会输出代表真的1
        NSLog(@"NSFileManagerTest.m是否为可写文件:%d", 
            [fm isWritableFileAtPath:@"NSFileManagerTest.m"]);
        // 将会输出代表假的0
        NSLog(@"NSFileManagerTest.m是否为可执行文件:%d", 
            [fm isExecutableFileAtPath:@"NSFileManagerTest.m"]);
        // 将会输出代表真的1
        NSLog(@"NSFileManagerTest.m是否为可删除文件:%d", 
            [fm isDeletableFileAtPath:@"NSFileManagerTest.m"]); 
        // 获取NSFileManagerTest.m文件所在的路径组件
        NSArray* array = [fm componentsToDisplayForPath:
            @"NSFileManagerTest.m"];
        NSLog(@"--NSFileManagerTest.m所在路径的完整路径组件为:--");
        for(NSObject* ele in array)
        {
            NSLog(@"%@ , " , ele);
        }
        // 获取文件的相关属性
        NSDictionary* attr = [fm attributesOfItemAtPath:@"NSFileManagerTest.m"
            error:nil];
        // 获取文件属性的详情
        NSLog(@"NSFileManagerTest.m的创建时间为:%@",
            [attr fileCreationDate]);
        NSLog(@"NSFileManagerTest.m的属主账户为:%@",
            [attr fileOwnerAccountName]);
        NSLog(@"NSFileManagerTest.m的文件大小为:%lld",
            [attr fileSize]);
        // 直接获取文件内容
        NSData* data = [fm contentsAtPath:@"NSFileManagerTest.m"];
        // 直接将NSData的数据用UTF-8的格式转换字符串
        NSString* content = [[NSString alloc] initWithData:data 
            encoding:NSUTF8StringEncoding];
        NSLog(@"----------输出文件内容---------");
        NSLog(@"%@" , content);
    }
}

NSFileManager的创建,删除,移动,复制等

上面的代码中包括但不全包括如下方法 :
1. fileExistsAtPath:——判读文件名对应的文件是否存在。
2. fileExistsAtPath:<#(nonnull NSString *)#> isDirectory:<#(nullable BOOL *)#>——判读文件名对应的文件或目录是否存在,该方法 的后一个参数 用于 返回该文件名是否为目录/文件夹。
3. isReadableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可读。
4. isWritableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可写。
5. isExecutableFileAtPath:(nonnull NSString *)——判断指定目录下的文件是否可执行
6. isDeletableFileAtPath:<#(nonnull NSString *)#>——判断指定目录下的文件是否可删除
7. componentsToDisplayForPath:<#(nonnull NSString *)#>——获取指定文件名对应 文件的 各个 路径组件。
8. displayNameAtPath:<#(nonnull NSString *)#>——获取 指定文件名对应文件的简单文件名
9. attributesOfFileSystemForPath:<#(nonnull NSString *)#> error:——获取指定文件名对应的 文件所在文件系统的属性。
10. attributesOfItemAtPath:<#(nonnull NSString *)#> error:——获取指定文件名对应 文件的属性
11. setAttributes:<#(nonnull NSDictionary<NSString *,id> *)#> ofItemAtPath:<#(nonnull NSString *)#> error:——设置指定文件名对应文件的属性。
这里写图片描述
12. contentsAtPath:<#(nonnull NSString *)#>——获取指定文件名对应文件的内容。
13. contentsEqualAtPath:<#(nonnull NSString *)#> andPath:<#(nonnull NSString *)#>——判断2个文件名指定的文件内容是否相同。
14. subpathsAtPath:<#(nonnull NSString *)#>——获得文件夹下的所有文件夹,递归读取
这里写图片描述
15. subpathsOfDirectoryAtPath:<#(nonnull NSString *)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>——非递归获取文件夹下的文件夹,深度遍历目录
16. - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error——浅度遍历目录
这里写图片描述
17. - (NSString *)currentDirectoryPath——获取当前目录
18. - (BOOL)changeCurrentDirectoryPath:(NSString *)path——更改当前目录
19. - (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path——枚举目录内容,获取指定目录下所有文件和子目录对应的枚举器,如果指定目录下的文件是子目录,该方法默认会递归子目录中所有的内容。(程序可以调用 NSDirectoryEnumerator 方法来阻止递归枚举子目录)
20. - (BOOL)createDirectoryAtPath:<(NSString *)path > withIntermediateDirectories:<(BOOL)createIntermediates> attributes:<(NSDictionary *)attributes> error:<(NSError **)error>——创建目录/文件夹
这里写图片描述
21. - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)contents attributes:(NSDictionary *)attributes——创建文件 (事先需要一个NSData),例如:

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:[NSString stringWithFormat:@”%@/1.txt”,path] contents:data attributes:nil];


22. - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error——复制文件/目录
示例:[fileManager copyItemAtPath:[NSString stringWithFormat:@"%@/1.txt",path] toPath:[NSString stringWithFormat:@"%@/bbb/1.txt",path] error:nil];
23. - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error——移动/重命名文件或者目录
文件移动 文件夹不存在刚会失败 不会新建文件夹,例如:
[fileManager moveItemAtPath:[NSString stringWithFormat:@"%@/1.txt",path] toPath:[NSString stringWithFormat:@"%@/ddd/1.txt",path] error:nil];
24. - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error——删除文件/目录
25. contentsOfDirectoryAtPath:<#(nonnull NSString *)#> error:——获取指定目录下的所有文件和子目录,对于指定目录下的子目录,该方法不会进行递归枚举。
示例代码1:

#import <Foundation/Foundation.h>

int main(int argc , char * argv[])
{
    @autoreleasepool{
        NSFileManager* fm = [NSFileManager defaultManager];
        // 创建目录
        [fm createDirectoryAtPath:@"xyz/abc"
            // 该参数指定如果父目录不存在,创建父目录
            withIntermediateDirectories:YES
            attributes:nil 
            error:nil];
        NSString* content = @"《疯狂iOS讲义》是我正在学习的图书!";
        // 创建一份文件
        [fm createFileAtPath:@"myInfo.txt"
            contents:[content dataUsingEncoding:NSUTF8StringEncoding]
            attributes:nil];
        // 复制一份新文件
        [fm copyItemAtPath:@"myInfo.txt"
            toPath:@"copyInfo.txt"
            error:nil];
    }
}

示例代码2:

#import <Foundation/Foundation.h>

int main(int argc , char * argv[])
{
    @autoreleasepool{
        NSFileManager* fm = [NSFileManager defaultManager];
        // 获取指定目录下所有文件和文件夹
        NSArray * array = [fm contentsOfDirectoryAtPath:@"."
            error:nil];
        for(NSString* item in array)
        {
            NSLog(@"%@" , item);
        }
        // 获取指定目录下所有文件和文件夹对应的枚举器
        NSDirectoryEnumerator* dirEnum =
            [fm enumeratorAtPath:@"."];
        NSString *file;
        // 枚举dirEnum中包含的每个文件
        while ((file = [dirEnum nextObject])) 
        {
            // 如果该文件的文件名以.m结尾
            if ([[file pathExtension] isEqualToString: @"m"]) {
                // 直接获取文件内容
                NSData* data = [fm contentsAtPath:file];
                // 直接将NSData的数据用UTF-8的格式转换字符串
                NSString* content = [[NSString alloc] initWithData:data 
                    encoding:NSUTF8StringEncoding];
                NSLog(@"----------输出文件内容---------");
                NSLog(@"%@" , content);
            }
        }
        // 获取当前目录下的所有子目录
//      NSArray* subArr = [fm subpathsOfDirectoryAtPath:@"." 
//          error:nil];//这个方法与下面的方法作用一样,用哪个都行
        NSArray* subArr = [fm subpathsAtPath:@"."];
        for(NSString* item in subArr)
        {
            NSLog(@"%@" , item);
        }
    }
}

补充参考资料:
1. 文件管理类NSFileManager常用操作 ,其中 包含了NSFileHandle类和NSFileManager类的常用操作。
2. IOS中级篇 —— NSFileManager常用方法

2014-11-20 11:47:54 u011374880 阅读数 404
ios文件读写


通过 NSHomeDrietory获取文件路径

NSString *homeD = NSHomeDrietory();//获取Home路径

NSString *fileD = [homeD stringByAppendingPathComponent:@"temp/xxx.xxx"];

这样可以获取xxx的完整路径了

_________________________________________________________________________________________________

使用NSSearchPathForDirectoriesInDomains获取指定路径

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];需要的路径

NSString *fileD = [documentSDirectory stringByAppendingPathComponent:@"xxx.txt"];

________________________________________________________________________________________________

NSSearchPathForDirectoriesInDomains具体检索一个子文件夹

NSDocumentDirectory 这个是个常量根类中的枚举变量吧,代表要查找的路径document

也可以使用NSCachesDirectory书名路径为Caches

NSUserDomainMask 这个指定了文件的检索范围只在沙箱内部 

最后YES指定了是否展开波浪线;在MAC系统中 ~代表主路径 (Home) 如果不展开 路径就如 ~/Document     如果展开就是完整的路径  一般都设为YES

_________________________________________________________________________________________________

使用NSTemportryDirectory获取临时文件的全路径

NSString * temD = NSTemportryDirectory();

NSString *fileD = [temD stringByAppendingPathComponent:@"xxx.txt"];

NSLog(@"%@",temD);

创建新文件

-(BOOL)createFileAtPath:(NSString*)path contents:(NSData*)data attributes:(NSDictionary *)attr;

要创建文件夹第一个参数就是他的全路径了,第二个是文件的内容,最后一个文件的属性

返回值为创建成功与失败

创建路径

-(Void)createDirectoryAtPath:(NSString *)path attributes:(NSDictionary)attr;

创建路径跟文件差不多

删除文件

-(BOOL)removeFileAtPath:(NSString*)path handler:(id)handler;

调用删除文件的函数需要指定全路径 并且制定handler来执行flieManager : willProcessPathfileManager:shouldProceedAfterError回调函数 也可以吧handler置为nil这样删除文件出错的时候会终止操作 并返回NO

写入数据:

//获取文件路径

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"fileName"];

NSString *temp = @"Hello world";

int a=1;

//创建数据缓冲

NSMutableData *writer = [[NSMutableData alloc] init];

//将字符串添加到缓冲中

[writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];

//将其他数据添加到缓冲中

[writer appendBytes:&a length:sizeof(a)];

//将缓冲的数据写入到文件中

[writer writeToFile:path atomically:YES];

[writer release];



读取数据:

int a;

Float b;

NSString *str;

NSData *reader = [NSData dataWithContentsOfFile:path];

str = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]

  encoding:NSUTF8StringEncoding];

[reader getBytes:&a range:NSMakeRange([temp length], sizeof(a)];

[reader getBytes:&str range:NSMakeRange([temp length] + sizeof(a), sizeof(b))];

NSLog(@"a:%@  b:%i str:%f"abstr);

读取工程中的文件:

读取数据时,要看待读取的文件原有的文件格式,是字节码还是文本,我经常需要重文件中读取字节码,所以我写的是读取字节文件的方式。

//用于存放数据的变量,因为是字节,所以是UInt8

UInt8 b = 0;

//获取文件路径

NSString *path = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@""];


//获取数据 

NSData *reader = [NSData dataWithContentsOfFile:path];

//获取字节的个数

int length = [reader length];

NSLog(@"------->bytesLength:%d", length);

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

{

//读取数据

[reader getBytes:&b range:NSMakeRange(i, sizeof(b))];

NSLog(@"-------->data%d:%d", i, b);    

}

实例

 @implementation ManagerFile

-(void)writeFile:(NSString *)file{     

     //创建文件管理器     

     NSFileManager *fileManager = [NSFileManager defaultManager];     

     //获取路径     

     //参数NSDocumentDirectory要获取那种路径     

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);     

     NSString *documentsDirectory = [paths objectAtIndex:0];//去处需要的路径         

     //更改到待操作的目录下     

     [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];     

     //创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nilattributes文件的属性,初始为nil     

     //获取文件路径     

     [fileManager removeItemAtPath:@"username" error:nil];     

     NSString *path = [documentsDirectory stringByAppendingPathComponent:@"username"];     

      //创建数据缓冲     NSMutableData *writer = [[NSMutableData alloc] init];     

      //将字符串添加到缓冲中     

      [writer appendData:[file dataUsingEncoding:NSUTF8StringEncoding]];     

      //将其他数据添加到缓冲中     

      //将缓冲的数据写入到文件中     

      [writer writeToFile:path atomically:YES];     

      [writer release];

}

-(NSString *)readFile{     

     //创建文件管理器     

      NSFileManager *fileManager = [NSFileManager defaultManager];     

      //获取路径     

      //参数NSDocumentDirectory要获取那种路径     

      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);     

     NSString *documentsDirectory = [paths objectAtIndex:0];//去处需要的路径         

     //更改到待操作的目录下     

     [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];     

      //获取文件路径     

      NSString *path = [documentsDirectory stringByAppendingPathComponent:@"username"];     

      NSData *reader = [NSData dataWithContentsOfFile:path];     

      return [[NSString alloc] initWithData:reader                                  encoding:NSUTF8StringEncoding];

}

@end

对一个文件重命名

  想要重命名一个文件,我们需要把文件移到一个新的路径下  。下面的代码创建了我们所期望的目标文件的路径,然后请求移动文件以及在移动之后显示文件目录  。

//通过移动该文件对文件重命名  

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]);  

__________________________________________________________________________________

获取一个目录内的文件及文件夹列表  。

NSFileManager *fileManager = [NSFileManager defaultManager];  

//在这里获取应用程序Documents文件夹里的文件及文件夹列表  

        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  

        NSString *documentDir = [documentPaths objectAtIndex:0];  

        NSError *error = nil;  

        NSArray *fileList = [[NSArray alloc] init];  

//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组  

        fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];  

 

以下这段代码则可以列出给定一个文件夹里的所有子文件夹名  

 

NSMutableArray *dirArray = [[NSMutableArray alloc] init];  

        BOOL isDir = NO;  

//在上面那段程序中获得的fileList中列出文件夹名  

        for (NSString *file in fileList) {  

                NSString *path = [documentDir stringByAppendingPathComponent:file];  

                [fileManager fileExistsAtPath:path isDirectory:(&isDir)];  

                if (isDir) {  

                        [dirArray addObject:file];  

                }  

                isDir = NO;  

        }  

        NSLog(@"Every Thing in the dir:%@",fileList);  

        NSLog(@"All folders:%@",dirArray);


2015-09-25 08:41:53 Bruce__Liu 阅读数 270


一、iOS中的沙盒机制

  • iOS应用程序只能对自己创建的文件系统读取文件,这个独立、封闭、安全的空间,叫做沙盒。它一般存放着程序包文件(可执行文件)、图片、音频、视频、plist文件、sqlite数据库以及其他文件。

  • 每个应用程序都有自己的独立的存储空间(沙盒)

  • 一般来说应用程序之间是不可以互相访问

模拟器沙盒的位置

/User/userName/Library/Application Support/iPhone Simulator

当我们创建应用程序时,在每个沙盒中含有三个文件,分别是Document、Library和temp。

  • Document:一般需要持久的数据都放在此目录中,可以在当中添加子文件夹,iTunes备份和恢复的时候,会包括此目录。

  • Library:设置程序的默认设置和其他状态信息

  • temp:创建临时文件的目录,当iOS设备重启时,文件会被自动清除


获取沙盒目录

  • 获取程序的根目录(home)目录

NSString *homePath = NSHomeDirectory()

  • 获取Document目录

NSArray  *paths = NSSearchPathDorDirectoriesInDomains(NSDocumentDicrectory,, NSUserDomainMark, YES);                                                                           NSString *docPath = [paths lastObject];

  • 获取Library目录

NSArray *paths = NSSearchPathForDirectoriseInDomains(NSLibraryDirectory, NSUserDomainMask, YES);                                                                                   NSString *docPath = [paths lastObject];   

  • 获取Library中的Cache

NSArray *paths = NSSearchPathForDirectoriseInDomains(NSCachesDirectory, NSUserDomainMask, YES);                                                                                   NSString *docPath = [paths lastObject];

  • 获取temp路径

NSString *temp = NSTemporaryDirectory( );


二、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;


三、NSData

  • NSData是用来包装数据的

  • NSData存储的是二进制数据,屏蔽了数据之间的差异,文本、音频、图像等数据都可用NSData来存储

NSData的用法

1.NSString与NSData互相转换

NSData-> NSString                                                                                     NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding];

NSString->NSData                                                                                      NSString *aString = @"1234abcd";
NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding]; 

将data类型的数据,转成UTF8的数据

+(NSString *)dataToUTF8String:(NSData *)data
{
NSString *buf = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [buf autorelease];
}

将string转换为指定编码 
+(NSString *)changeDataToEncodinString:(NSData *)data encodin:(NSStringEncoding )encodin{
    NSString *buf = [[[NSString alloc] initWithData:data encoding:encodin] autorelease];
    return buf;
}

2. NSData 与 UIImage
NSData->UIImage
UIImage *aimage = [UIImage imageWithData: imageData];
 
//例:从本地文件沙盒中取图片并转换为NSData
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *name = [NSString stringWithFormat:@"ceshi.png"];
NSString *finalPath = [path stringByAppendingPathComponent:name];
NSData *imageData = [NSData dataWithContentsOfFile: finalPath];
UIImage *aimage = [UIImage imageWithData: imageData];

3.NSData与NSArray  NSDictionary

+(NSString *)getLocalFilePath:(NSString *) fileName
{
return [NSString stringWithFormat:@"%@/%@%@", NSHomeDirectory(),@“Documents”,fileName];
}

包括将NSData写进Documents目录
从Documents目录读取数据
在进行网络数据通信的时候,经常会遇到NSData类型的数据。在该数据是dictionary结构的情况下,系统没有提供现成的转换成NSDictionary的方法,为此可以通过Category对NSDictionary进行扩展,以支持从NSData到NSDictionary的转换。声明和实现如下:

 
+ (NSDictionary *)dictionaryWithContentsOfData:(NSData *)data {     
    CFPropertyListRef list = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)data, kCFPropertyListImmutable, NULL);
    if(list == nil) return nil; 
    if ([(id)list isKindOfClass:[NSDictionary class]]) { 
         return [(NSDictionary *)list autorelease]; 
        } 
    else { 
         CFRelease(list); 
         return nil; 
        } 
}


四、文件管理常用方法

NSFileManager

创建一个文件并写入数据                                                                                    - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;

从一个文件中读取数据                                                                                       - (NSData *)contentsAtPath:(NSString *)path;

scrPath路径上的文件移动到dstPath路径上,注意这里的路径是文件路径而不是目录          - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **) error;

scrPath路径上的文件复制到dstPath路径上                                                            - (BOOL)copyItemAtPath:(NSString *)scrPath toPath:(NSString *)dstPath error:(NSError **) error;

比较两个文件的内容是否一样                                                                               - (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2;

文件时候存在                                                                                                  - (BOOL)fileExistsAtPath:(NSString *)path;

移除文件                                                                                                        - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **) error;


创建文件管理

NSFileManager *fileManager = [NSFileManager defaultManager];                          NSString *path = [NSHomeDirectory( )  stringByAppendingPathComponent:@"holyBible.txt"];                                                                                                     NSString *text = @"abcdefg"; 

将字符串转成NSData类型                                                                                 NSData *data = [text dataUsingEncoding: NSUTF8StringEncoding]; 

写入文件                                                                                                       BOOL success = [fileManager createFileAtPath:path contents:data attributes:nil];


创建文件夹 

NSString *filePath = [path stringByAppendingPathComponent:@"holyBible.txt"];     NSString *contect = @"abcdefg";                                                                     BOOL success = [fm createFileAtPath:filePath contents:[content dataUsingEncoding: NSUTF8StringEncoding] attributes:nil];


NSFileManager-读取内容                                                                                 NSData *fileData = [fileManager contentsAtPath:filePath];                                   NSString *content = [[NSString alloc] initWithData:fileData dataUsingEncoding: NSUTF8StringEncoding];

NSData-读取内容                                                                                          NSString *filePath = [path stringByAppendingPathComponent:@"holyBible.txt"];     NSData *data = [NSData dataWithContentOfFile:filePath];

NSString-读取内容                                                                                         NSString *filePath = [path stringByAppendingPathComponent:@"holyBible.txt"];     NSString *content = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

移动、复制文件                                                                                             

移动文件(重命名)                                                                                         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);                                                                                        }

2014-01-14 16:46:45 suifengerbi 阅读数 905

为Storyboard添加场景(Scene)

现在,你有一个storyboard,是时候开始添加应用程序的内容。 Xcode中提供了可以添加到一个脚本文件中的对象库。其中的一些是属于在一个视图的用户界面元素,如按钮和文本字段。其他定义您的应用程序的行为,但本身并不在屏幕上出现,比如视图控制器和手势识别。
首先,您将添加一个视图控制器到您的脚本。视图控制器管理相应的视图及其子视图。

将视图控制器添加到Storyboard中
1.在项目导航器中,选择Main.storyboard。
Xcode中打开故事板在Interface Builder,它的可视化界面编辑器,在编辑器区域。因为Storyboard是空的,你看到的是一个空白的画布(canvas)。您可以使用画布来添加和排列的用户界面元素。
2.打开对象库。
对象库出现在生活区的底部。如果您没有看到对象库,您可以点击相应的按钮,这是第三个按钮从左边库中选择吧。 (如果您没有看到实用面积,你可以通过选择View > Utilities > Show Utilities显示它。)

出现一个列表,显示每个对象的名称,描述和可视化表示。
3.从列表中拖动一个View Controller对象到画布上。
如果你不能找到标题为视图控制器在对象库中的对象,筛选对象列表通过键入下面的列表的文本字段。输入视图控制器,你可以看到在过滤列表中唯一的视图控制器对象。

在这一点上,在你的应用程序的脚本中包含一个场景。指向画布上的场景左侧的箭头是初始场景的指标,这意味着这一幕是首先加载应用程序启动时。现在,你在画布上看到的场景包含这是由一个视图控制器管理的单一视图。如果你在iPhone模拟器上运行你的应用程序,这种观点是你在设备屏幕上看到的。这是非常有用的在iPhone模拟器上运行你的应用程序,以确认一切都配置正确。在这之前,添加的东西,你就可以当你运行应用程序看到的一幕。

为场景添加一个标签
1.在对象库中,找到Label对象。
如果您在过滤器文本字段中输入文本,你可能需要清除其内容,然后才能看到Label对象。您还可以输入标签中的过滤器字段快速找到Label对象。
2.从列表中拖动一个Label对象到场景中。

3.标签拖动到场景的中心,直到水平和垂直辅助线出现。
停止拖动的标签,当你看到这样的事情:

如果你没有看到你添加的标签,请确保您创建的脚本被配置为您的应用程序的主界面,并确保你已经删除了在应用程序委托创建空的白色窗口的代码。如果有必要,回去重复上述步骤对那些部分。
这也是一个很好的时间来试验你可以添加一个接口是什么。探索Interface Builder中改变:
1.标签的文本
2.标签的字体大小
3.文字的颜色


2014-01-15 16:39:58 suifengerbi 阅读数 2274

本教程建立在您的第一个教程(基础教程)创建的项目。你会使用你学到的一些视图,视图控制器,操作和导航。下面的界面,第一个设计的过程中,您还可以创建一些关键的用户界面流程,作为你的todolist的应用程序,并添加运行你已经创建的场景。

本教程教您如何:

1.采用自动布局灵活添加到您的用户界面

2.用Storyboard来定义应用程序的内容和流量

3.管理多个视图控制器

4.加入行动元素在用户界面


在完成本教程中的所有步骤,你就会有一个应用程序,看起来像这样:


采用自动布局

加载项的项目的场景设定在肖像模式(portrait mode)下工作。因此,如果用户旋转设备会发生什么?尝试一下在模拟器上运行你的应用程序。
旋转模拟器
1.在iPhone模拟器启动你的应用程序。
2.选择Hardware > Rotate Left(或按Command-左箭头)。


正如你看到的,文本框看起来并不完全正确。停止大约一半在屏幕上。文本字段应该动动一路之隔的屏幕,因为它在纵向模式。幸运的是,Xcode中有一个称为自动布局功能强大的内置布局引擎。使用自动布局形容你的意图的场景元素的定位,然后让布局引擎确定如何最好地实现这一意图。您可以使用约束,规则解释,其中一个元素应位于相对于另一个,或者什么大小应该是,或者这两种元素应该先缩小东西时减少了可用于每个人的空间描述你的意图。对于附加的项目的场景(scene),需要一两套约束来定位文本字段并设置其大小等。
设置这些限制可以很容易地实现在Interface Builder。

使用自动布局定位文本框
1.在项目导航器中,选择Main.storyboard。
2.在你的脚本中,选择文本字段。
3.在画布上,按下Control键拖拽文本字段向现场的顶部,在周围的文本字段中的空结束。这个空间是文本字段的父视图。
出现快捷菜单,在你释放拖动的位置。



4.从快捷菜单中选择“Top Space to Top Layout Guide”。
一个隔约束文本字段的顶部和导航栏之间产生。
如果出现一个不同的快捷菜单中,或许还有一个菜单项,如“领导空间集装箱,”这是不是垂直拖动到屏幕的顶部,因为,你在一个不同的方向拖动。 Xcode使用你在拖,以此来了解什么样的你试图让约束的方向,它使用了拖动的起点和终点来了解哪些对象正由约束有关。来吧,尝试不同的拖动方向,看看有什么制约条件。
5.当你做实验,按下Control键拖拽文本字段右边,在超景结束,创造了“尾随空格键集装箱”的约束。
6.按下Control键拖拽文本字段的左侧,在它的父结尾,创造“空间领先的集装箱”的约束。

这些约束指定文本字段的边缘和它的父之间的距离不应改变。这意味着,如果该设备的方向改变时,文本字段将自动增长以满足这些约束。
注意:运行您的应用程序。如果旋转装置,该文本字段增大或缩小到合适的大小根据设备的方向。
如果你没有得到你期望的行为,使用Xcode的自动布局调试功能来帮助您。在文本字段中选择,选择Editor > Resolve Auto Layout Issues > “Reset to Suggested Constraints” 有Xcode中成立了由上述步骤中所述的限制。或选择Editor > Resolve Auto Layout Issues > Clear Constraints,以消除文本视图中的所有约束条件,然后尝试按照上面再次步骤。


虽然你的附加项目现场并没有做太多的是,基本的用户界面是存在的功能。从一开始就考虑布局,确保你有一个坚实的基础。

创建你第二个场景(Scene)

到目前为止,你一直都是做一个场景界面的,现在你可以将项目添加到您的事项列表视图控制器管理的单个场景。现在是时候创建一个显示整个的列表中的一幕。幸运的是, iOS的配备了一个强大的内置类,称为一个表视图,专门用来显示项目的滚动列表。

使用表格视图的场景添加到您的Storyboard

1.在项目导航器中,选择Main.storyboard 。
2.在工具框中,打开对象库。 (要打开一个菜单命令库,选择View > Utilities > Show Object Library。 )
3.从列表中拖动一个表视图控制器对象拖放到画布上的附加的to-do项目现场的左侧。如果需要,您可以使用缩小按钮图像在画布右下方获得足够的空间来将其拖动到。
如果你看到当您尝试将其拖动到画布的内容并没有什么表视图发生时,你很可能拖动表视图而不是表视图控制器。表视图是由表视图控制器管理的一件事,但你要全包,所以找到表​​视图控制器,并将其拖动到画布上。

现在你有两个场景,一个用于显示的事项列表,一个用于添加事项。

当他们启动您的应用程序的第一个看到的是这个场景,所以告诉Xcode中那是你的意图通过设置表视图控制器作为第一个场景。

设置表格视图控制器作为初始场景

1.使用按钮在画布的左下方如有必要,打开大纲视图图像。
2.在大纲视图中,选择新添加的表视图控制器。
3.在属性控制栏中与表视图控制器选中,打开属性检查器中的图像。
4.在属性检查器中,选择旁边的是初始视图控制器选项的复选框。

或者,你可以拖动从XYZAddToDoItemViewController的初始场景指标表视图控制器直接在画布上。
表视图控制器设置为你的storyboard的初始视图控制器,使得它加载的应用程序启动的第一个场景。

注意:运行您的应用程序。取而代之的是附加的项目现场,其​​文本字段,你现在应该看到一个空表视图一个与多个横向分隔将其分成行的画面,但每行中没有任何内容。





在表视图中显示静态内容

因为你还没有了解存储的数据是它的较早创建的和存储待办的项目,并在表格视图中显示它们。但你并不需要用真正的数据展现出来。 Xcode中,您可以创建在Interface Builder的一个表视图静态内容中。这使得它更容易看到你的用户界面将如何显示,这是一个有用的方式来尝试不同的想法。

在你的表视图中建立静态单元格(

static cell


1.在为你的界面视图中,选择下表视图控制器表视图。
2.视图中选择在属性栏中的 ,打开属性检查器中的图像。
3.在属性检查器中,选择从旁边的内容选项,在弹出的菜单中静态单元格。
三个空表视图单元格出现在你的表视图。
4.在大纲视图或画布上,选择最上面的单元格。
5.在属性检查器中,选择基本从旁边的样式选项的弹出式菜单。
基本样式包括一个标签,并在表格单元格文本“标题”,所以Xcode创建一个标签。
6.在大纲视图或画布上,选择标签。
7.在属性检查器中,更改标签的“标题”文本“修剪草坪。 ”对于以使更改生效,按Enter键或单击工具区域之外。
或者,您也可以通过双击它,并直接编辑文本编辑标签。
8.重复步骤4-7为其他细胞,给他们的文字为其他可能待办事项。
9.创造足够的细胞,使该项目超过填满整个屏幕。您可以通过复制并粘贴或拖动单元格时按住Option键创建新的细胞。
检查点:运行您的应用程序。您现在应该看到与你在Interface Builder中添加预配置的单元格的表视图。看到当你滚动它新的表视图的感受。尝试旋转模拟设备如何通知表视图已经配置正确铺陈其内容。您可以使用表格视图得到很多行为是免费的。


当您完成后,它的时间来提供一种方法从这个表视图导航,与待办事项的名单,为您创建的第一个场景,用户可以在其中创建一个新的待办事项。



ios文件操作

阅读数 325

没有更多推荐了,返回首页