如何使用 Url 初始化 OutputStream?
How to initialise an OutputStream with a Url?
我尝试创建一个 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) returns 为真。下一步是将生成的文件名附加到路径,我在这里做的
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
总是 nil
let ostream = OutputStream(url: urlToFile!, append: false)
我错过了什么吗? OutputStream 应该在此路径上创建文件,但由于未知原因,这是不可能的。
PS:AppGroup 已在功能和开发人员控制台中启用。
你的createProjectDirectoryPath()
函数return是一个文件路径,
因此您必须使用 URL(fileURLWithPath:)
将其转换为
URL
。或者,将您的函数修改为 return 和 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
}
此外,您必须先对所有 Stream
个对象调用 open()
它们可以使用,如果文件不存在,这也会创建文件
之前:
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()
我尝试创建一个 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) returns 为真。下一步是将生成的文件名附加到路径,我在这里做的
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
总是 nil
let ostream = OutputStream(url: urlToFile!, append: false)
我错过了什么吗? OutputStream 应该在此路径上创建文件,但由于未知原因,这是不可能的。
PS:AppGroup 已在功能和开发人员控制台中启用。
你的createProjectDirectoryPath()
函数return是一个文件路径,
因此您必须使用 URL(fileURLWithPath:)
将其转换为
URL
。或者,将您的函数修改为 return 和 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
}
此外,您必须先对所有 Stream
个对象调用 open()
它们可以使用,如果文件不存在,这也会创建文件
之前:
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()