仅通过更改大小写在 Swift 中重命名文件会出现错误:没有这样的文件或目录

Posted

技术标签:

【中文标题】仅通过更改大小写在 Swift 中重命名文件会出现错误:没有这样的文件或目录【英文标题】:Renaming a file in Swift only by changing case gives an error: No such file or directory 【发布时间】:2019-05-23 07:23:24 【问题描述】:

我想用 Swift 将一个文件重命名为相同的文件名,只是使用不同的大小写(你可以在 ios 操场上尝试):

filename = "NameWithCase"
newFilename = "Namewithcase"
var url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
let myText = "Some text to write to file"
try myText.write(to: url, atomically: true, encoding: .utf8)
url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(newFilename)
try myText.write(to: url, atomically: true, encoding: .utf8)

上面的代码给出了一个异常,我真的不知道如何避免它:

错误域=NSCocoaErrorDomain Code=4 "文件“Namewithcase” 不存在。” UserInfo=NSFilePath=..abrevified../tmp/Namewithcase, NSUnderlyingError=0x60000047f8d0 错误域=NSPOSIXErrorDomain Code=2 "没有这样的文件或目录"

如果我将新文件的文件名完全更改为 Namewithcase2,则一切正常。 我在这里想念什么?

【问题讨论】:

我必须承认这看起来很奇怪,但 URL 应该区分大小写吗?我的意思是它们不在网络浏览器中。 也许在FileManager中使用moveItem(at:to:)会更好,见this question 我也试过 moveItem。同样的问题,只是略有其他错误。 【参考方案1】:

这是 MacOS(即 HFS+ 文件系统)的固有问题,因为文件系统不区分大写字母和非大写字母。文件名不区分大小写,只保留大小写(意味着文件名以正确的大小写存储)。 所以唯一的解决办法是在另一个同名但大小写不同的保存操作之前删除文件:

try FileManager.default.removeItem(at: url)

【讨论】:

以上是关于仅通过更改大小写在 Swift 中重命名文件会出现错误:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 迁移中重命名列,强制小写

如何在 Xcode 5 中重命名项目?

在 Git 中重命名文件后没有预期的日志 [重复]

如何在 Visual Studio 2003 中重命名 C++ 源文件?

在 .net core openid 连接配置中重命名配置文件声明映射

Windows上的Git:重命名文件后无法切换分支(仅更改大小写)