首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileHandle不接受我的URL来进行写访问

FileHandle不接受我的URL来进行写访问
EN

Stack Overflow用户
提问于 2017-08-14 23:10:46
回答 2查看 1.9K关注 0票数 1

我想打开一个唯一命名的输出文件,用于编写plist或数据,但在使用init的URL例程(fileURLWithPath:)或init(string:)获得句柄方面没有任何进展。

代码语言:javascript
复制
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 (没有这样的实体!?)由于我需要一个的句柄,写到,我很困惑,怎么才能得到一个呢?示例路径是在桌面上创建的用于分类的新文件夹。

EN

回答 2

Stack Overflow用户

发布于 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)

票数 4
EN

Stack Overflow用户

发布于 2017-08-14 23:49:13

无法为不存在的文件创建文件句柄。这就是导致ENOENT错误的原因。

使用FileManager createFile(atPath:contents:attributes:)在创建文件句柄之前创建文件。

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45684329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档