如何使用Url初始化OutputStream?

时间:2017-06-05 09:47:33

标签: ios swift file stream ios-app-group

我尝试为应用程序组文件夹创建一个OutputStream,其创建方式如下:

 func createProjectDirectoryPath(path:String) -> String
    {
        let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xyz")
        let logsPath = containerURL!.appendingPathComponent(path)
        NSLog("12345- folder path: %@", logsPath.path)

        do {
            try FileManager.default.createDirectory(atPath: logsPath.path, withIntermediateDirectories: true, attributes: nil)
        } catch let error as NSError {
            NSLog("12345- Unable to create directory %@", error.debugDescription)
        }
        return logsPath.path
    }

这个函数给了我这样的路径

/private/var/mobile/Containers/Shared/AppGroup/40215F20-4713-4E23-87EF-1E21CCFB45DF/pcapFiles

此文件夹存在,因为FileManager.default.fileExists(path)行返回true。下一步是将生成的文件名附加到路径,我在这里做

let urlToFile = URL(string: createProjectDirectoryPath(path: "pcapFiles").appending("/\(filename)"))

给了我正确的新路径

/private/var/mobile/Containers/Shared/AppGroup/40215F20-4713-4E23-87EF-1E21CCFB45DF/pcapFiles/39CC2DB4-A6D9-412E-BAAF-2FAA4AD70B22.pcap

如果我拨打此行,ostream始终为

let ostream = OutputStream(url: urlToFile!, append: false)

我错过了什么吗? OutputStream应该在此路径上创建文件,但由于未知原因,它是不可能的。

PS:在功能部件和开发人员控制台中启用了AppGroup。

1 个答案:

答案 0 :(得分:1)

您的createProjectDirectoryPath()函数返回文件路径 因此,您必须使用URL(fileURLWithPath:)将其转换为 URL。或者,修改您的函数以返回URL代替:

func createProjectDirectoryPath(path:String) -> URL? {
    let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xyz")
    let logsURL = containerURL!.appendingPathComponent(path)
    do {
        try FileManager.default.createDirectory(at: logsURL, withIntermediateDirectories: true)
    } catch let error as NSError {
        NSLog("Unable to create directory %@", error.debugDescription)
        return nil
    }
    return logsURL
}

此外,您必须先在所有open()个对象上调用Stream 它们可以使用,如果文件不存在,也会创建该文件 之前:

guard let logsURL = createProjectDirectoryPath(path: "pcapFiles") else {
    fatalError("Cannot create directory")
}
let urlToFile = logsURL.appendingPathComponent(filename) 
guard let ostream = OutputStream(url: urlToFile, append: false) else {
    fatalError("Cannot open file")
}
ostream.open()