我想打开一个唯一命名的输出文件,用于编写plist或数据,但在使用init的URL例程(fileURLWithPath:)或init(string:)获得句柄方面没有任何进展。
func NewFileHandleForWritingFile(path: String, name: String, type: String, outFile: inout String?) -> FileHandle? {
let fm = FileManager.default
var file: String? = nil
var uniqueNum = 0
while true {
let tag = (uniqueNum > 0 ? String(format: "-%d", uniqueNum) : "")
let unique = String(format: "%@%@.%@", name, tag, type)
file = String(format: "%@/%@", path, unique)
if false == fm.fileExists(atPath: file!) { break }
// Try another tag.
uniqueNum += 1;
}
outFile = file!
do {
let fileURL = URL.init(fileURLWithPath: file!)
let fileHandle = try FileHandle.init(forWritingTo: fileURL)
print("\(file!) was opened for writing")
//set the file extension hidden attribute to YES
try fm.setAttributes([FileAttributeKey.extensionHidden: true], ofItemAtPath: file!)
return fileHandle
} catch let error {
NSApp.presentError(error)
return nil;
}
}调试器显示

对于这个using例程,它添加了方案(file://),否则与另一个相同),我更喜欢在使用路径时抛出reutrning (-1)的新方法。抛出的错误(2)是ENOENT (没有这样的实体!?)由于我需要一个的句柄,写到,我很困惑,怎么才能得到一个呢?示例路径是在桌面上创建的用于分类的新文件夹。
发布于 2017-08-15 00:02:53
与前面的答案不同,我建议使用Data的write(to:options:) API而不是FileManager的createFile(atPath:contents:attributes:),因为它是一个基于URL的API,它通常比基于路径的API更好。Data还会抛出一个错误,而不是只在失败时返回false,所以如果出了问题,您可以告诉用户原因。
try Data().write(to: fileURL, options: [])
我还建议将基于路径的FileManager.fileExists(atPath:)替换为基于URL的checkResourceIsReachable()。
if false == ((try? fileURL.checkResourceIsReachable()) ?? false)
发布于 2017-08-14 23:49:13
无法为不存在的文件创建文件句柄。这就是导致ENOENT错误的原因。
使用FileManager createFile(atPath:contents:attributes:)在创建文件句柄之前创建文件。
do {
fm.createFile(atPath: file!, contents: nil, attributes: [FileAttributeKey.extensionHidden: true])
let fileURL = URL(fileURLWithPath: file!)
let fileHandle = try FileHandle(forWritingTo: fileURL)
print("\(file!) was opened for writing")
return fileHandle
} catch let error {
NSApp.presentError(error)
return nil;
}https://stackoverflow.com/questions/45684329
复制相似问题