Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift FileHandle不接受我的URL进行写访问_Swift_Cocoa_File Writing_Filehandle - Fatal编程技术网

Swift FileHandle不接受我的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

我想打开一个唯一命名的输出文件,用于写入plist或数据,但使用initfileURLWithPath:或initstring:的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;
    }
}
调试器显示


对于这个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。。