2

这可能很容易,但我没有遇到问题。
我正在使用下面的代码重命名文档目录的文件夹,并且除了一种情况外工作正常。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Photos"];
    NSArray * arrAllItems = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dataPath error:NULL]; // List of all items
    NSString *filePath = [dataPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", [arrAllItems objectAtIndex:tagSelected]]];

    NSString *newDirectoryName = txtAlbumName.text; // Name entered by user
    NSString *oldPath = filePath;
    NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newDirectoryName];
    NSError *error = nil;
    [[NSFileManager defaultManager] moveItemAtPath:oldPath toPath:newPath error:&error];
    if (error) {
        NSLog(@"%@",error.localizedDescription);
        // handle error
    }


现在,我的问题是如果there is a folder named "A"(capital letter A) and I am renaming it to "a" (small letter a), then it is not working and giving an error.
我没有找到问题所在。

4

1 回答 1

4

HFS+ 文件系统(在 OS X 上)不区分大小写,但保留大小写。这意味着如果您创建一个文件夹“A”,然后检查是否有一个文件夹“a”,您将得到“是”作为答案。

文件管理器moveItemAtPath:toPath:...首先检查目标路径是否已经存在,因此失败

NSUnderlyingError=0x7126dc0 "The operation couldn’t be completed. File exists"

一种解决方法是先将目录重命名为完全不同的名称:

A --> temporary name --> a

但更简单的解决方案是使用 BSDrename()系统调用,因为它可以毫无问题地将“A”重命名为“a”:

if (rename([oldPath fileSystemRepresentation], [newPath fileSystemRepresentation]) == -1) {
    NSLog(@"%s",strerror(errno));
}

请注意,该问题仅出现在 iOS 模拟器上,而不会出现在设备上,因为设备文件系统区分大小写

迅速:

let result = oldURL.withUnsafeFileSystemRepresentation { oldPath in
    newURL.withUnsafeFileSystemRepresentation { newPath in
        rename(oldPath, newPath)
    }
}
if result != 0 {
    NSLog("%s", strerror(errno))
}
于 2013-08-17T08:53:34.900 回答