Swift FileHandle不接受我的URL进行写访问
我想打开一个唯一命名的输出文件,用于写入plist或数据,但使用initfileURLWithPath:或initstring:的URL例程都无法获得句柄Swift FileHandle不接受我的URL进行写访问,swift,cocoa,file-writing,filehandle,Swift,Cocoa,File Writing,Filehandle,我想打开一个唯一命名的输出文件,用于写入plist或数据,但使用initfileURLWithPath:或initstring:的URL例程都无法获得句柄 func NewFileHandleForWritingFile(path: String, name: String, type: String, outFile: inout String?) -> FileHandle? { let fm = FileManager.default var file: 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;
}
}
调试器显示
对于这个URL init例程,它添加了scheme文件:/,但在其他方面与另一个相同,我更喜欢在使用路径时抛出reutrning-1的新方法。抛出的错误2是一个eNONT,没有这样的实体!?因为我需要一个句柄来写,我不知道怎么才能得到一个?示例路径是在桌面上创建的用于分类的新文件夹。您不能为不存在的文件创建文件句柄。这就是导致eNONT错误的原因 在创建文件句柄之前,使用FileManager createFileatPath: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;
}
无法为不存在的文件创建文件句柄。这就是导致eNONT错误的原因 在创建文件句柄之前,使用FileManager createFileatPath: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;
}
与前面的答案不同,我建议使用Data的writeto:options:API而不是FileManager的createFileatPath:contents:attributes:,因为它是基于URL的API,通常比基于路径的API更受欢迎。Data方法也会抛出错误,而不是在失败时返回false,因此如果出现问题,您可以告诉用户原因 请尝试Data.writeto:fileURL,选项:[] 我还建议将基于路径的FileManager.fileExistsatPath:替换为基于URL的CheckResourceisRechable:
如果false==尝试?fileURL.CheckResourceisRechable??false与前面的答案不同,我建议使用Data的writeto:options:API而不是FileManager的createFileatPath:contents:attributes:,因为它是基于URL的API,通常比基于路径的API更受欢迎。Data方法也会抛出错误,而不是在失败时返回false,因此如果出现问题,您可以告诉用户原因 请尝试Data.writeto:fileURL,选项:[] 我还建议将基于路径的FileManager.fileExistsatPath:替换为基于URL的CheckResourceisRechable:
如果false==尝试?fileURL.CheckResourceisRechable??false与写数据或plist相比,我仍在犹豫,但我会记住这一点,谢谢!最后,我创建了一个变量函数,它返回一个url供编写,这样我就可以使用建议的数据编写方法:try data.writeto:fileURLWell与编写数据或plist相比,我仍然犹豫不决,但我会记住这一点,谢谢!最后,我创建了一个变量函数,该函数返回一个用于写入的url,这样我就可以使用建议的数据写入方法:try data.writeto:fileUrl您是个救生员。我花了几个小时试图从自定义后台队列中写入一些文件,但data.writeto:和FileHandle API失败,但与manager.createFile API一起工作。是否有文档确认您的声明,即在写入数据之前必须先创建文件?我在主队列上有一个不同的代码片段,它只是在没有manager.createFile API的情况下开箱即用。这确实是一个令人困惑的行为。@Devandarist它在FileHandle init的文档中?forWritingTo:String:初始化的文件句柄对象,或者如果路径上不存在文件,则为零。。你是个救生员。我花了几个小时试图从自定义后台队列中写入一些文件,但data.writeto:和FileHandle API失败,但与manager.createFile API一起工作。是否有文档确认您的声明,即在写入数据之前必须先创建文件?我在主队列上有一个不同的代码片段,它只是在没有manager.createFile API的情况下开箱即用。这确实是一个令人困惑的行为。@Devandarist它在FileHandle init的文档中?forWritingTo:String:初始化的文件句柄对象,或者如果路径中不存在文件,则为nil。。