1

假设我们有一个小写的路径 /path/to/file。现在在文件系统上,文件的名称是 /path/to/File。

如何检查文件是否具有正确的相同名称。

NSFileManager attributesOfItemAtPath:error: 
NSFileManager fileExistAtPath:

两种情况都返回 YES。有没有办法获得路径的文件系统表示并比较字符串,或者是否有任何其他扩展方法来检查文件是否存在区分大小写的名称。

4

2 回答 2

1

如果没有明确配置,HFS 不区分大小写(这似乎不鼓励)。这意味着/path/to/file/PaTH/tO/fILe是等价的。

但是,您可以枚举目录中的文件并使用

NSURL* url = [NSURL fileURLWithPath:@"/path/to/file"];
NSArray *files = [[NSFileManager defaultManager]
                  contentsOfDirectoryAtURL:url.URLByDeletingLastPathComponent
                  includingPropertiesForKeys:nil
                  options:0
                  error:nil];
for (NSString* fileName in files) {
    if ([[fileName lowercaseString] isEqualToString:@"file"]) {
        // fileName is the case sensitive name of the file.
    }
}
于 2017-08-25T10:04:23.977 回答
0

F_GETPATH您可以使用文件系统控制调用打开文件并获取其“真实”名称(存储在文件系统中) :

NSString *path = @"/tmp/x/File.txt";

NSFileManager *fm = [NSFileManager defaultManager];
int fd = open([fm fileSystemRepresentationWithPath:path], O_RDONLY);
if (fd != -1) {
    char buffer[MAXPATHLEN];
    if (fcntl(fd, F_GETPATH, buffer) != -1) {
        NSString *realPath = [fm stringWithFileSystemRepresentation:buffer length:strlen(buffer)];
        NSLog(@"real path: %@", realPath);
    }
    close(fd);
}

斯威夫特版本:

let path = "/tmp/x/File.txt"
let fm = FileManager.default
let fd = open(fm.fileSystemRepresentation(withPath: path), O_RDONLY)
if fd != -1 {
    var buffer = [CChar](repeating: 0, count: Int(MAXPATHLEN))
    if fcntl(fd, F_GETPATH, &buffer) != -1 {
        let realPath = String(cString: buffer)
        print("real path: ", realPath)
    }
    close(fd)
}
于 2017-08-25T10:08:12.490 回答