处理文件路径字符串

我们用字符串来表达文件的位置(路径)。这会在我们处理文件是经常碰到,也就是说,存储文件路径的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所在的目录。最后一行,我们又把这两部分合成为原来的路径。

现在,你已经看到了一些处理路径的method。你可以在NSString的类使用指南中看到全部的叙述。自然,使用指南的描述会比我们这里更加详细些。

 

怎样获得documents文件夹以及为文件改名  收藏

  可以使用c函数NSSearchPathForDirectoriesInDomain来查找各种目录。它是Foundation函数,因此它可以与Cocoa for Mac OS X共享。它的很多可用选项都是专门为OS X设计的,在iphone上不会返回任何值。其原因在于,这些位置并不存在于iphone(如Downloads文件夹)上,或者你的应用程序由于iPhone的沙盒机制而没有访问该位置的权限。

view plain copy to clipboard print ?
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2. NSString *documentsDirectory = [paths objectAtIndex:0];  
 

常量NSDocumentDirectory表明我们正在查找Documents目录的路径。第二个常量NSUserDomaininMask表明我们希望将搜索限制于我们应用程序的沙盒。

    如果你需要更改一个文件的文件名,你可能会查找NSFileManager的API,但你发现该死的API里根本没有改名的方法,但我们肯定会要应用到改名的操作。其实苹果很狡诈,在movePath方法中是可以用来改名的。

view plain copy to clipboard print ?
  1. NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];  
  2. [[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];  
 

newFilename是你新文件名,只需要把老文件写入到这个新文件中即完成了改名。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值