2017-08-14 49 views
0

我想打开一个唯一命名的输出文件来编写plist或数据,但没有任何运气可以使用init的任何URL例程(fileURLWithPath :)或init (字符串:)FileHandle不接受我的URL进行写入访问

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; 
    } 
} 

调试器显示

debugger shows

这对于该URL的init程序添加方案(文件://),但其它方面与其他的,我想更喜欢在ju时抛出reutrning(-1)的新方法st使用路径。抛出错误(2)是一个ENOENT(没有这样的实体!?),因为我需要一个处理写给我很困惑,要怎么得到一个?示例路径是在桌面上创建的用于分类的新文件夹。

回答

2

您无法为不存在的文件创建文件句柄。这是导致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; 
} 
2

不同于以往的答案,我建议使用数据的write(to:options:) API,而不是文件管理器的createFile(atPath:contents:attributes:),因为它是一个基于URL的API,通常要优于基于路径的。 Data方法也会抛出一个错误,而不是仅仅在失败时返回false,所以如果出现错误,你可以告诉用户为什么。

try Data().write(to: fileURL, options: [])

我也建议更换路径为基础与FileManager.fileExists(atPath:)的基于URL checkResourceIsReachable()

if false == ((try? fileURL.checkResourceIsReachable()) ?? false)

+0

嗯,我仍持观望态度对写入数据或plist中,但我会记住这一点,谢谢! – slashlos

+0

我结束了创建一个返回网址写这样我就可以使用建议的数据写入方法的变形功能:'尝试data.write(到:fileURL)' – slashlos