swift - FileHandle 不接受我的 URL 进行写访问

标签 swift cocoa file-writing filehandle

我想打开一个唯一命名的输出文件来写入 plist 或数据,但没有运气使用 init(fileURLWithPath:) 或 init(string:) 的 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 例程添加了方案 (file://),但在其他方面与另一个相同,我更喜欢使用路径时抛出 reutrning (-1) 的更新方法。抛出的错误 (2) 是一个 ENOENT(没有这样的实体!?),因为我需要一个句柄来写入 我很困惑怎么才能得到一个?示例路径是在桌面上创建的一个新文件夹,用于分类。

最佳答案

与之前的答案不同,我建议使用 Data 的 write(to:options:) API 而不是 FileManager 的 createFile(atPath:contents:attributes:),因为它是基于 URL 的 API,通常优于基于路径的 API。 Data 方法还会抛出错误,而不是在失败时返回 false,因此如果出现问题,您可以告诉用户原因。

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

我还建议将基于路径的 FileManager.fileExists(atPath:) 替换为基于 URL 的 checkResourceIsReachable():

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

关于swift - FileHandle 不接受我的 URL 进行写访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684329/

相关文章:

xml - 尝试在Cocoa应用程序中发送curl POST命令

c# - 如何检查ffmpeg何时完成视频片段?

java - 读取和写入文件时,输出会发生变化

image - Golang Websocket 检测文件消息并在超过 1 个 ws 帧字节时写入

Swift 从私钥获取 RSA 公钥?

objective-c - 当函数的类不继承自 NSObject 时,从 ObjC 调用一个 swift 实例函数

cocoa - 桌面中的 NSShadow 和卷纸效果

XCode 在调用函数之前调用它?

iOS UICollectionview 渲染背景颜色错误

ios - 即使缓存策略设置为 ReloadIgnoringLocalAndRemoteCacheData,Alamofire 也会从缓存中加载