老谭笔记

对替身(Alias)文件的操作

对于替身文件的操作,以前我们可以直接使用CarbonCore/Aliases.h这个头里面的方法,比如FSIsAliasFile,FSResolveAlias,FSNewAliasFromPath等方法来判定是否是替身文件,找到替身的原文件和创建替身,但这些方法在10.8系统上都已经DEPRECATED,所以目前最好都使用更高级的API来对替身操作.在更高级的API中我们就会发现,原来Alias会被用在Bookmark之中,所以通过对NSURL中Bookmark相关的方法就可以方便的处理替身文件了,以下就是对应上文中的FS中的三个方法新的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//返回是否为替身文件(特意区分了SymbolicLink)
- (BOOL)isAlias:(NSString *)aliasPath
{
NSURL *aliasURL = [NSURL fileURLWithPath:aliasPath];
if (!aliasURL)
return NO;
NSString *fileType = nil;
BOOL status = [aliasURL getResourceValue:&fileType forKey:NSURLFileResourceTypeKey error:NULL];
if (!status || !fileType || ![fileType isEqualToString:NSURLFileResourceTypeRegular])
return NO;
NSNumber *aliasValue = nil;
status = [aliasURL getResourceValue:&aliasValue forKey:NSURLIsAliasFileKey error:NULL];
if (!status || !aliasValue)
return NO;
return [aliasValue boolValue];
}
//返回替身文件的原身
- (NSString *)resolvingAlias:(NSString *)aliasPath
{
NSURL *aliasURL = [NSURL fileURLWithPath:aliasPath];
if (!aliasURL)
return nil;
NSData *aliasData = [NSURL bookmarkDataWithContentsOfURL:aliasURL error:NULL];
if (!aliasData)
return nil;
/*
NSURLBookmarkResolutionWithoutUI 如果原文件是需要挂载的磁盘,挂载的过程中不显示UI
NSURLBookmarkResolutionWithoutMounting 如果原文件在一个未挂载的磁盘,则不必挂载,但会返回NULL
NSURLBookmarkResolutionWithSecurityScope 适用于沙盒下使用替身文件(创建时指定了NSURLBookmarkCreationWithSecurityScope)
*/
BOOL stale = NO;
NSURL *originalURL = [NSURL URLByResolvingBookmarkData:aliasData
options:NSURLBookmarkResolutionWithoutUI
relativeToURL:nil
bookmarkDataIsStale:&stale
error:NULL];
if (!originalURL)
return nil;
return [originalURL path];
}
//创建替身文件
- (BOOL)createAlias:(NSString *)aliasPath fromPath:(NSString *)originalPath
{
NSURL *aliasURL = [NSURL fileURLWithPath:aliasPath];
if (!aliasURL)
return NO;
NSURL *originalURL = [NSURL fileURLWithPath:originalPath];
if (!originalURL)
return NO;
NSURLBookmarkCreationOptions createOptions = NSURLBookmarkCreationSuitableForBookmarkFile;
NSData *aliasData = [originalURL bookmarkDataWithOptions:createOptions
includingResourceValuesForKeys:nil
relativeToURL:nil
error:NULL];
if (!aliasData)
return NO;
return [NSURL writeBookmarkData:aliasData
toURL:aliasURL
options:createOptions
error:NULL];
}

更多的代码片段可以watch我GitHub上的这个Repository:https://github.com/tanhaogg/THCategory