NSString简单细说(二十二)—— 与路径相关(一)

版本记录

版本号 时间
V1.0 2017.08.21

前言

前面我简单的写了些NSString的初始化,写了几篇,都不难,但是可以对新手有一定的小帮助,对于大神级人物可以略过这几篇,NSString本来就没有难的,都是细枝末节,忘记了查一下就会了,没有技术难点,下面我们继续~~~
1. NSString简单细说(一)—— NSString整体架构
2. NSString简单细说(二)—— NSString的初始化
3. NSString简单细说(三)—— NSString初始化
4. NSString简单细说(四)—— 从URL初始化
5. NSString简单细说(五)—— 向文件或者URL写入
6. NSString简单细说(六)—— 字符串的长度
7. NSString简单细说(七)—— 与C字符串的转化
8. NSString简单细说(八)—— 识别和比较字符串
9. NSString简单细说(九)—— 字符串的合并
10. NSString简单细说(十)—— 字符串的分解
11. NSString简单细说(十一)—— 字符串的查找
12. NSString简单细说(十二)—— 字符串的替换
13. NSString简单细说(十三)—— 字符串的分行和分段
14. NSString简单细说(十四)—— 字符串位置的计算
15. NSString简单细说(十五)—— 字符串转化为propertyList
16. NSString简单细说(十六)—— 画字符串
17. NSString简单细说(十七)—— 字符串的折叠和前缀
18. NSString简单细说(十八)—— 字符串中大小写子母的变换
19. NSString简单细说(十九)—— 根据映射获取字符串
20. NSString简单细说(二十)—— 获取字符串的数值
21. NSString简单细说(二十一)—— 字符串与编码
这一篇我们说一下与路径相关

与路径相关

一、+ (NSString *)pathWithComponents:(NSArray<NSString *> *)components;

下面看一下参数,这个参数是一个数组。它是一个字符串的集合,创建绝对路径,使用/作为第一个部分,同时包含尾随路径分隔符,使用空字符串作为最后的部分。该方法不会清除创建的路径,使用stringByStandardizingPath解析空的部分,相对父路径。该方法的返回值就是根据数组中的对象顺序,用路径分隔符将他们分开。

下面看代码。

    /**
     * 1. + (NSString *)pathWithComponents:(NSArray<NSString *> *)components;
     *
     *  @param encoding:An array of NSString objects representing a file path. To create an absolute path, use a slash mark (“/”) as the first component. To include a trailing path divider, use an empty string as the last component.
     *
     *  @return:A string built from the strings in components by concatenating them (in the order they appear in the array) with a path separator between each pair.
     *
     */

    NSArray *strArr = @[@"Iam",@"a",@"winner"];
    NSString *str = [NSString pathWithComponents:strArr];
    NSLog(@"str1 = %@",str);

下面看输出结果。

2017-07-01 23:17:35.190 NSString你会用吗?[1362:52972] str1 = Iam/a/winner

结论:这个方法还好。


二、@property(readonly, copy) NSArray<NSString *> *pathComponents;

这个方法和方法一正好是可逆的,这个方法返回的是路径组成的各个部分。返回的组成部分和它们在路径中的顺序是一样的,如果字符串以路径分隔符开始或者结束,那么第一个部分或者最后一个部分是分隔符自己,下面看代码。

    /**
     * 2.@property(readonly, copy) NSArray<NSString *> *pathComponents;
     */
    
    NSString *str1 = @"Ttt/hello/China";
    NSArray *arr1 = str1.pathComponents;
    NSLog(@"arr1 = %@",arr1);
    
    NSString *str2 = @"/hello/China";
    NSArray *arr2 = str2.pathComponents;
    NSLog(@"arr2 = %@",arr2);
    
    NSString *str3 = @"hello";
    NSArray *arr3 = str3.pathComponents;
    NSLog(@"arr3 = %@",arr3);

下面看输出结果。

2017-07-01 23:31:12.036 NSString你会用吗?[1528:63957] arr1 = (
    Ttt,
    hello,
    China
)
2017-07-01 23:31:12.037 NSString你会用吗?[1528:63957] arr2 = (
    "/",
    hello,
    China
)
2017-07-01 23:31:12.038 NSString你会用吗?[1528:63957] arr3 = (
    hello
)

结论:简单易懂。


三、- (NSUInteger)completePathIntoString:(NSString * _Nullable *)outputName caseSensitive:(BOOL)flag matchesIntoArray:(NSArray<NSString *> * _Nullable *)outputArray filterTypes:(NSArray<NSString *> *)filterTypes;

很多解释可以从官方文档或者示例代码给出。

下面看一下参数。

参数列表
  • outputName:包含满足所有条件的最长的路径。
  • flag:如果是YES就考虑路径中的大小写字母,反之不考虑。
  • outputArray:输出数组,包含满足条件的所有子文件夹路径。
  • filterTypes:过滤满足添加的输出文件类型,如果传递为nil,表示不关心文件类型,也就是说可以输出文件类型。

这个方法的作用其实就是:找到满足一定条件的文件扩展名,例如,给定一个文件夹~/Demo包含以下文件ReadMe.txt 、readme.html 、readme.rtf 、recondite.txt 、test.txt

你可以找到可能的路径~/Demo/r,如下所示。

NSString *partialPath = @"~/Demo/r";
NSString *longestCompletion;
NSArray *outputArray;
 
unsigned allMatches = [partialPath completePathIntoString:&longestCompletion
    caseSensitive:NO
    matchesIntoArray:&outputArray
    filterTypes:nil];
 
// allMatches = 3
// longestCompletion = @"~/Demo/re"
// outputArray = (@"~/Demo/readme.html", "~/Demo/readme.rtf", "~/Demo/recondite.txt")

上面所有以r开头的子文件就都找到了。这里filterTypes传递为nil表示不限制文件搜索的类型,如果想要限制就给一个文件类型的数组就可以了。

NSArray *filterTypes = @[@"txt", @"rtf"];
 
unsigned textMatches = [partialPath completePathIntoString:&outputName
    caseSensitive:NO
    matchesIntoArray:&outputArray
    filterTypes:filterTypes];
// allMatches = 2
// longestCompletion = @"~/Demo/re"
// outputArray = (@"~/Demo/readme.rtf", @"~/Demo/recondite.txt")

上面这个例子,限制了文件类型为txtrtf,所以找到的子文件类型也就是这两种类型的。

还有的地方需要注意:

  • 对于返回值,如果返回0,表示没有找到;如果返回1,表示只能找到一个,如果很多条件都满足匹配,那么返回的就是匹配的个数。
  • 您可以通过将NULL作为outputArray检查是否存在匹配,而无需检索。请注意,此方法仅适用于文件路径(不是例如URL的字符串表示)。

结论:很少用,但是值得一看。


四、@property(readonly) const char *fileSystemRepresentation;

这个属性是只读的就是文件路径的C字符串,下面还是直接看代码。

- (void)demoFileSystemRepresentation
{
    NSString *str = @"lily";
    
    NSString *f1 = [NSHomeDirectory() stringByAppendingPathComponent:@"ReadMe.txt"];
    NSString *f2 = [NSHomeDirectory() stringByAppendingPathComponent:@"readme.html"];
    NSString *f3 = [NSHomeDirectory() stringByAppendingPathComponent:@"readme.rtf"];
    NSString *f4 = [NSHomeDirectory() stringByAppendingPathComponent:@"recondite.txt"];
    NSString *f5 = [NSHomeDirectory() stringByAppendingPathComponent:@"test.txt"];
    
    [str writeToFile:f1 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    [str writeToFile:f2 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    [str writeToFile:f3 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    [str writeToFile:f4 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    [str writeToFile:f5 atomically:NO encoding:NSUTF8StringEncoding error:nil];
    
    const char *path = [f1 fileSystemRepresentation];
    NSLog(@"%s", path);
}

下面看输出结果

2017-08-21 17:25:44.175894+0800 JJOC[10757:5124305] /var/mobile/Containers/Data/Application/9F04B6FB-2A0D-4719-B5BC-8DE4D89DFFB9/ReadMe.txt

这里还有几点需要注意:

  • 返回的C字符串将被自动释放,因为返回的对象将被释放;如果需要在这个字符串生成的内存上下文以外存储这个结果表达式,您的代码应该复制这个结果表达式或使用方法getFileSystemRepresentation:maxLength:
  • 如果接收者无法在文件系统编码中表示或者接收者没有字符,则会引发NSCharacter ConversionException异常。
  • 请注意,此方法仅适用于文件路径(不适用于URL的字符串表示)。要转换char *路径(例如可以从C库例程获得)到NSString对象,请在NSFileManager上使用stringWithFileSystemRepresentation:length:method方法。

结论:这个我也没用过。


五、- (BOOL)getFileSystemRepresentation:(char *)cname maxLength:(NSUInteger)max;

下面我们看一下参数和返回值:

  • cname:它是一个字符类型的指针,返回时,包含表示接收器的C字符串,即为与系统无关的路径加上NULL终止字节。 缓冲区的大小必须足够大以容纳maxLength字节。
  • max:缓冲区中返回的字符串中的最大字节数(包括终止NULL字符,此方法添加)。
  • return :如果缓冲区成功的被填充了文件系统表示,则为YES,否则为NO(例如,如果超过maxLength或者文件系统编码中无法表示接收器)。

下面我们就看代码。

- (void)demoGetFileSystemRepresentation
{
    char filenameBuffer[13];
    BOOL success;
    success = [@"/mach_kernel" getFileSystemRepresentation:filenameBuffer maxLength:12];
    // success == NO
    NSLog(@"success = %d", success);
    
    // Changing the length to include the NULL character does work
    success = [@"/mach_kernel" getFileSystemRepresentation:filenameBuffer maxLength:13];
    // success == YES
    NSLog(@"success = %d", success);
}

下面我们看输出结果

2017-08-21 17:45:00.791624+0800 JJOC[10762:5126205] success = 0
2017-08-21 17:45:00.791672+0800 JJOC[10762:5126205] success = 1

这里还有几点需要注意:

  • 该方法通过将抽象路径和扩展分隔符(分别为'/'和'.')替换为操作系统的等效项来操作。 如果特定于系统的路径或扩展分隔符以抽象表示形式出现,则将其转换为依赖于系统的字符(除非它们与抽象分隔符相同)。
  • 请注意,此方法仅适用于文件路径(不适用于URL的字符串表示)。
  • 上面的示例说明了使用maxLength参数。 第一个方法调用返回失败,因为字符串(@“/ mach_kernel”)的文件表示为12个字节长,并且作为maxLength参数(12)传递的值不允许添加NULL终止字节。

结论:还算好理解吧。


六、@property(getter=isAbsolutePath, readonly) BOOL absolutePath;

这个属性的目的就是判断是否是绝对路径,它是只读的。下面我们看一下实例代码。

- (void)demoAbsolutePath
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
    NSLog(@"path = %@", path);
    NSLog(@"是绝对路径?%d", path.absolutePath);
}

下面看输出结果

2017-08-21 18:11:22.758044+0800 JJOC[10770:5132186] path = /var/containers/Bundle/Application/E265D8CD-F47F-452B-A4C7-8651DB10ACB3/JJOC.app/1.gif
2017-08-21 18:11:22.758131+0800 JJOC[10770:5132186] 是绝对路径?1

还有几个方面需要注意:

  • 请注意,此方法仅适用于文件路径(不是,例如,URL的字符串表示)。 该方法不会检查文件系统是否存在该路径(对于该任务,在NSFileManager中使用fileExistsAtPath:或类似方法)。

结论:这个还是会用到的。


七、@property(readonly, copy) NSString *lastPathComponent;

这个属性就是获取路径等分隔符分开的最后的一部分。下面还是看代码。

- (void)demoLastPathComponent
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
    NSLog(@"path = %@", path);
    NSLog(@"路径?%@", path.lastPathComponent);
}

下面看输出结果

2017-08-21 18:21:20.559206+0800 JJOC[10778:5133700] path = /var/containers/Bundle/Application/B1E0B625-F0A7-412C-9D44-D24C7BDFF0AD/JJOC.app/1.gif
2017-08-21 18:21:20.559309+0800 JJOC[10778:5133700] 路径?1.gif

还有几点需要注意:

  • 路径组件是由路径分隔符(斜杠“/”)或路径字符串的开头或结尾描绘的字母数字字符串。 字符串末尾的多路径分隔符被剥离。看一下下表几种不同的情况,应用该方法的返回值。
输入 输出
/tmp/scratch.tiff scratch.tiff
/tmp/scratch scratch
/tmp/ tmp
scratch/// scratch
/ /

结论:这个需要好好理解,我总用这个。


八、@property(readonly, copy) NSString *pathExtension;

下面我们还是要先看一下代码。

- (void)demoPathExtension
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1.gif" ofType:nil];
    NSLog(@"path = %@", path);
    NSLog(@"%@", path.pathExtension);
}

下面看输出结果

2017-08-21 18:32:47.461214+0800 JJOC[10781:5134801] path = /var/containers/Bundle/Application/85335E84-49E1-4079-AA84-1A017D801FD6/JJOC.app/1.gif
2017-08-21 18:32:47.461336+0800 JJOC[10781:5134801] gif

这里还有几点需要注意:

  • 请注意,此方法仅适用于文件路径(不是例如URL的字符串表示)。
  • 路径扩展是最后一个路径组件的最后一个周期的部分,如果有的话。 扩展分隔符不包括在内。 下表说明了pathExtension对各种不同路径的影响:
输入 输出
/tmp/scratch.tiff tiff
.scratch.tiff tiff
/tmp/scratch/ an empty string
/tmp/ an empty string
/tmp/scratch..tiff/ tiff

结论:这个也总会用到。

后记

未完,待续~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容