2017-06-05 3 views
0

je tente de créer un OutputStream dans un dossier de groupe d'applications, qui est créé comme suit:Comment un OutputStream avec initialiser une URL?

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 
    } 

Cette fonction me donne un chemin comme celui

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

Ce dossier existe, parce que la ligne FileManager .default.fileExists (chemin) renvoie la valeur true. L'étape suivante consiste à ajouter un nom de fichier généré sur le chemin, que je fais ici

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

qui me donne le nouveau chemin correct

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

Si j'appelle cette ligne, ostream est toujours nulle

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

Est-ce que je manque quelque chose? Le OutputStream devrait créer le fichier sur ce chemin, mais pour une raison inconnue, ce n'est pas possible.

PS: AppGroup est activé dans les capacités et dans la console des développeurs.

Répondre

1

Votre fonction createProjectDirectoryPath() renvoie un fichier chemin , donc vous devez utiliser URL(fileURLWithPath:) pour convertir en un URL. Vous pouvez également modifier votre fonction pour retourner un URL à la place:

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 
} 

En outre, vous devez appeler open() sur tous les objets Stream avant ils peuvent être utilisés, cela permettra également de créer le fichier si elle n'existait pas avant :

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()