我们用字符串来表达文件的位置(路径)。这会在我们处理文件是经常碰到,也就是说,存储文件路径的NSString字符串对象。
Cocoa中文件路径的字符串表示是标准的,NSString也提供了一系列的method供我们处理文件路径字符串。这些method帮助我们把相对路径替换为绝对路径,解析符号链接,抽取路径成分到新的字符串中,以及处理文件扩展名。
现在我们都知道Mac OS X是建筑在Unix之上的(我很希望苹果电脑能够通过这一个步骤获得发展),因此,目录和文件都是按照Unix的方式进行组织和操作的。有几点与一般的Macintosh不同方式是我们需要了解的(我相信多数人都知道这些,但包括一些基础知识总不是一件坏事,希望大家能够忍耐这一点)。
在Unix中,用户的主目录缩写为波浪号(“~”)。这是在文件系统中移动的很有用的快捷方式。例如,我在我的iBook上的主目录的扩展形式为/Users/mike/,简写形式为~。但是,路径字符串中的波浪号并不会被认为事合法的路径,所以我们要使用-stringByExpandingTildeInPath这个method来扩展路径。下面是例子:
NSString *shortPath = @"~/textFile.txt";
NSString *absolutePath = [shortPath stringByExpandTildeInPath];
- stringByExpandingTildeInPath这个method通过把波浪号替换为当前用户的主目录,来把textFile.txt转换为扩展的绝对路径。现在新的路径是/User/mike/textFile.txt。我们也可以反过来做,把用户的主目录路径替换为波浪号。我们使用的method是:-stringByAbbreviatingWithTildeInPath:
NSString *path = [absolutepath stringByAbbreviatingWithTildeInPath];
它会把path变量设置为~/textFile.txt。我们注意到在所有的这些method中(以前我们上次谈到的)第一个单词都是“string”,它的意思是这些以string开头的消息返回的都是一个字符串。这种语法在Cocoa中很常见,我们会在数组,数字,字典等中看到它。Cocoa的method命名尽量能做到不含混(这的确会使输入的字母增加,但我觉得可读,不含混的代码是值得的)。
文件扩展名在Unix中很流行(很多Mac用户不屑于这一点)。文件扩展名是附加在文件名之后的一些字符,两者之间用句点分开(在Cocoa中,句点本身不算扩展名的部分)。我们可以通过调用- pathExtension来产生一个包含扩展名的新字符串。它返回一个NSString对象,包含文件扩展名,不包括句点。
NSString *path = @"~/textFile.txt";
NSString *pathExtension = [path pathExtension];
pathExtension这个字符串的值将是“txt”。句点将被去掉了。如果没有句点指明扩展名,将返回一个空串。如果文件不存在,也将返回空串。
显然,还有一个method来做相反的事情,也就是,给文件名添上扩展名。这个method是:-stringByAppendingPathExtension:。如果我们有一个路径字符串是:/Users/mike/textFile,我们可以用以下的办法给它添上扩展名:
NSString *path = @"/User/mike/textFile";
path = [path stringByAppendingPathExtension: @"txt"];
这样,path变量的值为/Users/mike/textFile.txt。注意,我们在这个例子中吧返回的新字符串重新存在原来的变量中。
如果我们需要去掉扩展名,而只留下路径和文件名,我们可以使用method:-stringByDeletingPathExtension。我们用回我们原来的路径/Users/mike/textFile.txt:
path = [path stringByDeletingPathExtension];
现在path变量将为/Users/mike/textFile。这个method返回原始的字符串,而去掉了扩展名(包括连接扩展名的句点)。
NSString中另一套有用的路径操作工具是使我们操作路径的各个部分:如各个目录名,文件名等。首先是-pathComponents。看起来很简单,它做的事情是把一个路径字符串按照斜线分隔拆成几个子串,并把它们放到一个NSArray对象中。我们现在还没有谈到NSArray,但它其实只不过是Cocoa风格的标准数组。所以,如果我们有以下的路径:
NSString *thisColumn = @"/Users/mike/Documents/Cocoa_Column/Column8.doc"
(我承认,我相当喜欢Word这个程序。) -pathComponents将把它拆开,并放到一个数组中,就象这样:
NSArray *theComponents = [thisColumn pathComponents];
结果的数组大概是这样的:
数组索引路径单元0Users1mike2Documents3Cocoa_Column4Column8.doc
它使得我们可以完全控制访问任意层次的目录和文件变得很容易。如果我们得需求比较简单,我们可以使用一些控制最后一个单元的method,通常这已经足够了。它们是-lastPathComponent,-stringByAppendingPathComponent:,和-stringByDeletingLastPathComponent。它们的作用和它们的名字是一样的。如果是同样的上边的路径,
NSString *thisColumn = @"/Users/mike/Documents/Cocoa_Column/Column8.doc"
然后我们执行以下的代码:
NSString *lastComponent = [thisColumn lastPathComponent];
NSString *pathLessFilename = [thisColumn stringByDeletingLastPathComponent];
NSString *originalPath = [pathLessFilename stringByAppendingPathComponent: lastComponent];
最后,originalPath和thisColumn是相等的。原因是,第一行我们创建了一个新的字符串,它的值是lastPathComponent(这些method的命名是不是很好?)返回的thisColumn的最后一个路径单元:“Column8.doc”。第二行我们创建了另外一个字符串,它是Column8.doc所在的目录。最后一行,我们又把这两部分合成为原来的路径。
Cocoa中文件路径的字符串表示是标准的,NSString也提供了一系列的method供我们处理文件路径字符串。这些method帮助我们把相对路径替换为绝对路径,解析符号链接,抽取路径成分到新的字符串中,以及处理文件扩展名。
现在我们都知道Mac OS X是建筑在Unix之上的(我很希望苹果电脑能够通过这一个步骤获得发展),因此,目录和文件都是按照Unix的方式进行组织和操作的。有几点与一般的Macintosh不同方式是我们需要了解的(我相信多数人都知道这些,但包括一些基础知识总不是一件坏事,希望大家能够忍耐这一点)。
在Unix中,用户的主目录缩写为波浪号(“~”)。这是在文件系统中移动的很有用的快捷方式。例如,我在我的iBook上的主目录的扩展形式为/Users/mike/,简写形式为~。但是,路径字符串中的波浪号并不会被认为事合法的路径,所以我们要使用-stringByExpandingTildeInPath这个method来扩展路径。下面是例子:
NSString *shortPath = @"~/textFile.txt";
NSString *absolutePath = [shortPath stringByExpandTildeInPath];
- stringByExpandingTildeInPath这个method通过把波浪号替换为当前用户的主目录,来把textFile.txt转换为扩展的绝对路径。现在新的路径是/User/mike/textFile.txt。我们也可以反过来做,把用户的主目录路径替换为波浪号。我们使用的method是:-stringByAbbreviatingWithTildeInPath:
NSString *path = [absolutepath stringByAbbreviatingWithTildeInPath];
它会把path变量设置为~/textFile.txt。我们注意到在所有的这些method中(以前我们上次谈到的)第一个单词都是“string”,它的意思是这些以string开头的消息返回的都是一个字符串。这种语法在Cocoa中很常见,我们会在数组,数字,字典等中看到它。Cocoa的method命名尽量能做到不含混(这的确会使输入的字母增加,但我觉得可读,不含混的代码是值得的)。
文件扩展名在Unix中很流行(很多Mac用户不屑于这一点)。文件扩展名是附加在文件名之后的一些字符,两者之间用句点分开(在Cocoa中,句点本身不算扩展名的部分)。我们可以通过调用- pathExtension来产生一个包含扩展名的新字符串。它返回一个NSString对象,包含文件扩展名,不包括句点。
NSString *path = @"~/textFile.txt";
NSString *pathExtension = [path pathExtension];
pathExtension这个字符串的值将是“txt”。句点将被去掉了。如果没有句点指明扩展名,将返回一个空串。如果文件不存在,也将返回空串。
显然,还有一个method来做相反的事情,也就是,给文件名添上扩展名。这个method是:-stringByAppendingPathExtension:。如果我们有一个路径字符串是:/Users/mike/textFile,我们可以用以下的办法给它添上扩展名:
NSString *path = @"/User/mike/textFile";
path = [path stringByAppendingPathExtension: @"txt"];
这样,path变量的值为/Users/mike/textFile.txt。注意,我们在这个例子中吧返回的新字符串重新存在原来的变量中。
如果我们需要去掉扩展名,而只留下路径和文件名,我们可以使用method:-stringByDeletingPathExtension。我们用回我们原来的路径/Users/mike/textFile.txt:
path = [path stringByDeletingPathExtension];
现在path变量将为/Users/mike/textFile。这个method返回原始的字符串,而去掉了扩展名(包括连接扩展名的句点)。
NSString中另一套有用的路径操作工具是使我们操作路径的各个部分:如各个目录名,文件名等。首先是-pathComponents。看起来很简单,它做的事情是把一个路径字符串按照斜线分隔拆成几个子串,并把它们放到一个NSArray对象中。我们现在还没有谈到NSArray,但它其实只不过是Cocoa风格的标准数组。所以,如果我们有以下的路径:
NSString *thisColumn = @"/Users/mike/Documents/Cocoa_Column/Column8.doc"
(我承认,我相当喜欢Word这个程序。) -pathComponents将把它拆开,并放到一个数组中,就象这样:
NSArray *theComponents = [thisColumn pathComponents];
结果的数组大概是这样的:
数组索引路径单元0Users1mike2Documents3Cocoa_Column4Column8.doc
它使得我们可以完全控制访问任意层次的目录和文件变得很容易。如果我们得需求比较简单,我们可以使用一些控制最后一个单元的method,通常这已经足够了。它们是-lastPathComponent,-stringByAppendingPathComponent:,和-stringByDeletingLastPathComponent。它们的作用和它们的名字是一样的。如果是同样的上边的路径,
NSString *thisColumn = @"/Users/mike/Documents/Cocoa_Column/Column8.doc"
然后我们执行以下的代码:
NSString *lastComponent = [thisColumn lastPathComponent];
NSString *pathLessFilename = [thisColumn stringByDeletingLastPathComponent];
NSString *originalPath = [pathLessFilename stringByAppendingPathComponent: lastComponent];
最后,originalPath和thisColumn是相等的。原因是,第一行我们创建了一个新的字符串,它的值是lastPathComponent(这些method的命名是不是很好?)返回的thisColumn的最后一个路径单元:“Column8.doc”。第二行我们创建了另外一个字符串,它是Column8.doc所在的目录。最后一行,我们又把这两部分合成为原来的路径。
现在,你已经看到了一些处理路径的method。你可以在NSString的类使用指南中看到全部的叙述。自然,使用指南的描述会比我们这里更加详细些。
怎样获得documents文件夹以及为文件改名 收藏
可以使用c函数NSSearchPathForDirectoriesInDomain来查找各种目录。它是Foundation函数,因此它可以与Cocoa for Mac OS X共享。它的很多可用选项都是专门为OS X设计的,在iphone上不会返回任何值。其原因在于,这些位置并不存在于iphone(如Downloads文件夹)上,或者你的应用程序由于iPhone的沙盒机制而没有访问该位置的权限。
view plain copy to clipboard print ?
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
常量NSDocumentDirectory表明我们正在查找Documents目录的路径。第二个常量NSUserDomaininMask表明我们希望将搜索限制于我们应用程序的沙盒。
如果你需要更改一个文件的文件名,你可能会查找NSFileManager的API,但你发现该死的API里根本没有改名的方法,但我们肯定会要应用到改名的操作。其实苹果很狡诈,在movePath方法中是可以用来改名的。
view plain copy to clipboard print ?
- NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
- [[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];
newFilename是你新文件名,只需要把老文件写入到这个新文件中即完成了改名。。。。。