2017-06-05 86 views
0

我嘗試創建一個OutputStream到一個應用程序組文件夾,這是爲創建如下:如何使用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 

此文件夾所在的路徑,因爲該行文件管理.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

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 
} 

此外,你必須呼籲所有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()