我们想要写入给定目录中的“foo.txt”。如果“foo.txt”已经存在,我们要写入“foo-1.txt”,依此类推。
有一些代码片段试图回答这个问题,但没有一个是令人满意的。例如。 this solution at CocoaDev使用 NSFileManager 测试路径是否存在以创建安全路径。然而,这会导致获取路径和写入路径之间出现明显的竞争条件。尝试原子写入并在失败时循环数字后缀会更安全。
加油!
最佳答案
使用带有 O_EXCL
和 O_CREAT
选项的 open
系统调用。如果该文件尚不存在,open
将创建它,打开它,并将文件描述符返回给您;如果确实存在,open
将失败并将 errno
设置为 EEXIST
。
从这里开始,应该很明显如何构造尝试递增文件名的循环,直到返回文件描述符或构造太长的文件名。对于后一点,请确保在 open
失败时检查 errno
- EEXIST
和 ENAMETOOLONG
只是其中两个您可能会遇到的错误。
关于cocoa - 如何安全地写入 Cocoa 中的给定文件路径,并在必要时添加数字后缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770727/