Directory exist...

Jcb84Jcb84 Membre
septembre 2018 modifié dans API AppKit #1

Bonjour à tous,

Quelqu'un aurait il 3 minutes pour relire le bout de code ci-dessous et me dire pourquoi mon test sur l'existence du répertoire (et sur le fichier) échoue systématiquement ...

Mon code fonctionne mais j'aimerai bien comprendre le pourquoi du comment...
Merci d'avance.
Jc

func createPrivateFolder(){

    let fileManager = FileManager.default
    var isDirExist = false
    var isDirectory = ObjCBool(true)

    let paths:[String] = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
    let directory:String = paths[0]
    let cacheDirectoryUrl = URL(fileURLWithPath: directory, isDirectory: true).appendingPathComponent(Bundle.main.bundleIdentifier ?? "MyApp").appendingPathComponent("Cache")

    print(directory)
    print(cacheDirectoryUrl.absoluteString)
    print(cacheDirectoryUrl.absoluteURL)

    // Est-ce que le répertoire existe ?
    if !fileManager.fileExists(atPath: cacheDirectoryUrl.absoluteString, isDirectory: &isDirectory ){

        do {
            try fileManager.createDirectory(at: cacheDirectoryUrl , withIntermediateDirectories: true, attributes: nil)
            print("Creation folder ok !")
            isDirExist = true
        }
        catch {
            print("Error: Unable to create directory: \(error)")
        }
    } else {
        print("Directory already exists !")
        isDirExist = true
    }

    if isDirExist {
        // step 2 creation fichier
        let fichierFolderXml = cacheDirectoryUrl.appendingPathComponent("folder.dat")
        print("create file ?")
        if !fileManager.fileExists(atPath : fichierFolderXml.absoluteString ){
            do {

                let pendingInstallId = "yourId:\(UUID())"
                try pendingInstallId.write(to: fichierFolderXml, atomically: false, encoding: String.Encoding.utf8)
                print("create file OK")
            }
            catch {
                print("Error: Unable to create file: \(error)")
            }
        } else {
            print("folder.xml already exists in folder...")
        }
    }
}
Mots clés:

Réponses

  • if !fileManager.fileExists(atPath: cacheDirectoryUrl.absoluteString, isDirectory: &isDirectory ) =>
    if !fileManager.fileExists(atPath: cacheDirectoryUrl.path, isDirectory: &isDirectory )?

    Pareil pour : if !fileManager.fileExists(atPath : fichierFolderXml.absoluteString ){ => if !fileManager.fileExists(atPath : fichierFolderXml.path ){

  • Merci !

    Il me semblait pourtant avoir essayer avec .path ... je me doutais que c'etait le %20 qui me mettais le bronx...

  • Joanna CarterJoanna Carter Membre, Modérateur
    septembre 2018 modifié #4

    Apple recommande fortement d'utiliser les méthodes d'URL à la place de celles de FileManager.

    Et, en plus, il faut passer true à fileManager.createDirectory(at: _, withIntermediateDirectories: _, attributes:_)

    Voici du code comme exemple :

      func createPrivateFolder()
      {
        let fileManager = FileManager.default
    
        guard let applicationSupportURL = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else
        {
          return
        }
    
        let cacheDirectoryUrl = applicationSupportURL.appendingPathComponent(Bundle.main.bundleIdentifier ?? "MyApp").appendingPathComponent("Cache")
    
        do
        {
          let _ = try cacheDirectoryUrl.checkResourceIsReachable()
        }
        catch CocoaError.fileReadNoSuchFile
        {
          do
          {
            try fileManager.createDirectory(at: cacheDirectoryUrl, withIntermediateDirectories: true, attributes: nil)
          }
          catch CocoaError.fileNoSuchFile
          {
              print("withIntermediateDirectories should be true")
          }
          catch
          {
            print("unhandled error")
          }
        }
        catch
        {
          print("unhandled error")
        }
    
        let fichierXmlUrl = cacheDirectoryUrl.appendingPathComponent("file.dat")
    
        do
        {
          let _ = try fichierXmlUrl.checkResourceIsReachable()
        }
        catch CocoaError.fileReadNoSuchFile
        {
          let pendingInstallId = "yourId:\(UUID())"
    
          do
          {
            try pendingInstallId.write(to: fichierXmlUrl, atomically: false, encoding: .utf8)
          }
          catch
          {
            print("could not write file")
          }
        }
        catch
        {
          print("unhandled error")
        }
      }
    
Connectez-vous ou Inscrivez-vous pour répondre.