Récupérer liste des noms de fichiers .txt

PatyomPatyom Membre
juin 2017 modifié dans API AppKit #1

Ok Joanna, j'ai jeté un oeil aussi sur une vidéo qui traite de çà .


 


autre question : j'ai créé un bout de code pour remplir une Combobox dans laquelle je ne doit prendre que les fichiers dont l'extension est : ".txt", voilà  mon code.



// Fonction de recherche de fichiers avec extension : ".txt"
func rechercheListeFichiers(folder: URL) {

let showInvisibles: Bool = false
let fileManager = FileManager.default

do {

let contents = try fileManager.contentsOfDirectory(atPath: folder.path)

contenu = contents
.filter { return showInvisibles ? true : $0.characters.first != "." }
.map { $0.components(separatedBy: ".txt")[0]}

} catch {

print("erreurs")

}

}

Donc je ne prends que les fichiers qui ne commencent pas par "." et je ne prends que tout ce qui se trouve avant le ".txt" mais quelle est l'instruction qui m'empêche de prendre les fichiers qui n'ont pas l'extension ".txt" ?


 


Comment faites-vous ?


 


"contenu" est déclaré plus haut dans la Class


«1

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    juin 2017 modifié #2

    C'est plus facile que ça :



    func getTextFileURLs(at folderURL: URL) -> [URL]
    {
    do
    {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: [])

    return directoryContents.filter{ $0.pathExtension == "txt" }
    }
    catch
    {
    print("errors")
    }

    return []
    }

    Si tu ne voulais que les noms des fichiers, tu pourrais faire :



    func getTextFiles(at folderURL: URL) -> [String]
    {
    do
    {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: [])

    return directoryContents.filter{ $0.pathExtension == "txt" }.map{ $0.lastPathComponent }
    }
    catch
    {
    print("errors")
    }

    return []
    }

  • PatyomPatyom Membre
    juin 2017 modifié #3

    merci,


     


    avec '.map{ $0.lastPathComponent }', tu affiches le nom avec l'extension ?


     


    et sans l'extension ?


     


    PS : Moi qui n'avais jamais tenté de me lancer dans la pratique d'Objective-C et de Swift (maintenant), je me rends compte que c'est époustouflant ce que l'on peut faire et colossal comme logiciel.


  • CéroceCéroce Membre, Modérateur

    PS : Moi qui n'avais jamais tenté de me lancer dans la pratique d'Objective-C et de Swift (maintenant), je me rends compte que c'est époustouflant ce que l'on peut faire et colossal comme logiciel.


    Ce sont des emprunts à  la programmation fonctionnelle.
  • Joanna CarterJoanna Carter Membre, Modérateur
    juin 2017 modifié #5


    merci,


     


    avec '.map{ $0.lastPathComponent }', tu affiches le nom avec l'extension ?


     


    et sans l'extension ?





    func getTextFileNames(at folderURL: URL) -> [String]
    {
    do
    {
    let directoryContents = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: [])

    return directoryContents.filter{ $0.pathExtension == "txt" }.flatMap{ $0.lastPathComponent.components(separatedBy: ".").first }
    }
    catch
    {
    print("errors")
    }

    return []
    }

  • Je butte sur des trucs tout bête exemple :


     


    comment vider une tableview ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    juin 2017 modifié #7


    Je butte sur des trucs tout bête exemple :


    comment vider une tableview ?


    Les NSTableViews ne contient aucune donnée.


    Renvois 0 de la méthode numberOfRows(in:) du dataSource delegate
  • PatyomPatyom Membre
    juin 2017 modifié #8

    Je m'explique :


    dans mon viewController j'ai un tableview que je rempli au départ avec des données tirées d'internet mais comme ces données évoluent toutes les 10 mn je clique sur un bouton pour relancer l'extraction des ces données et je les ré-affiche mais encore faut'il que je rase celles qui y sont déjà .


     


    Peut-être faut-il que je les élimine avec une boucle for ou while ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu ne dois pas "remplir" le tableView. Tu devrais l'alimenter d'un delegate NSTableViewDataSource


  • PatyomPatyom Membre
    juin 2017 modifié #10

    Bonjour,


    Après un break brico et une prise de tête pour trouver comment ôter les données affichées dans la tableView, je vous sollicite car je n'ai pas encore trouvé la solution et ce n'est pas faute d'avoir essayé. :'(


     


    Je me suis basé sur le prog "FileViewer" et je l'ai fait défiler pas à  pas sans succès.


     


    Je dois oublier quelque chose dans mon raisonnement.


  • DrakenDraken Membre
    juin 2017 modifié #11


    Bonjour,


    Après un break brico et une prise de tête pour trouver comment ôter les données affichées dans la tableView, je vous sollicite car je n'ai pas encore trouvé la solution et ce n'est pas faute d'avoir essayé. :'(


     




    Qu'est-ce qu'une tableView ? Un composant graphique servant à  afficher des données. Mais il ne contient aucune donnés en lui même. Elles lui sont fournies par une dataSource, une source de données, un tableau par exemple. La tableView n'est que la représentation graphique des informations contenues dans le tableau.


     


    Pour " vider " une tableView, tu vides le tableau ou tu changes son contenu. Ensuite tu appelle la méthode reloadData() de la tableView., qui signifie " ton contenu est devenu obsolète. Il faut recharger toutes les données à  partir de la dataSource ".


     


    https://developer.apple.com/documentation/uikit/uitableview

  • Joanna CarterJoanna Carter Membre, Modérateur
    juin 2017 modifié #12

    Bone tuto sur NSTableView ici : https://www.raywenderlich.com/143828/macos-nstableview-tutorial


     


    Avec les liens vers les autres infos dans la section "Where to Go From Here"


  • PatyomPatyom Membre
    juin 2017 modifié #13



    C'est le tuto dont je fais référence dans mon dernier post mais j'ai trouvé (enfin) mon erreur, il y avait une variable que je ne remettais pas à  "rien" donc il y avait un cumul de lignes à  la suite.


     


    Ouf, je vais pouvoir continuer mon apprentissage.


     


    A plus tard !! et merci            


  • Bonjour,


    Pour extraire une donnée que la tableview affiche il faut donc se rapporter à  la variable "tableau" qui remplie cette tableview, c'est cela ?


  • CéroceCéroce Membre, Modérateur
    Oui, c'est cela.
  • PatyomPatyom Membre
    juin 2017 modifié #16

    Bonjour,


    Maintenant je dois remplacer un élément d'un tableau du genre


     


    Voilà  ce que j'ai dans ma variable tableau position 0 :


    TB[0] = "01:00;PAYS;Importance;Libéllé"


    Je fais ensuite un 


     


    TB[0].components(separatedBy: ";")


     


    et je me retrouve avec un nouveau tableau de l'élément TB[0]:


     


    TBInter = ["01:00","PAYS","Faible","Libéllé"]


     


     


    Là , je voudrais changer "Faible" par "Forte"


     


    Je crois que c'est l'instruction "replaceSubrange" qu'il faut utiliser ?


     


    Je voudrais changer en fait tout ce qui se trouve dans la position 2 entièrement peu importe le texte qui s'y trouve


  • CéroceCéroce Membre, Modérateur
    juin 2017 modifié #17

    Ton approche est mauvaise.


    Quand on reçoit un JSON, par exemple:

     



    "personnes" = [
    "nom": "Dupont",
    "prenom": "Jean"
    ]

    On ne s'amuse pas à  décomposer le JSON à  chaque fois. Non, on le parse une fois, dans le but d'avoir des classes ou des struct de la forme:

     



    struct Personne {
    let nom: String
    let prenom: String
    }

    Si à  la fin, on veut enregistrer le fichier, alors on reconvertit la liste de Personnes en JSON.


    Dans ton cas, c'est pareil: n'essaie pas de changer des bouts de texte. Parcours le texte une fois, extrais des objets. Ensuite, c'est facile de modifier les objets.


    P.S. Cocoa utilise l'architecture MVC: https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

    Comprends que ta liste fait partie du Modèle.




  • et je me retrouve avec un nouveau tableau de l'élément TB[0]:


     


    TBInter = ["01:00","PAYS","Faible","Libéllé"]


     


     


    Là , je voudrais changer "Faible" par "Forte"


     


     




    a


    Rien de plus simple, puisque TBInter est un tableau de String. Tu modifie juste son contenu à  l'index 2.


    a



    TBInter[2] = "Le nouveau contenu"

    a

  • J'ai cogité çà  pendant le repas et j'allais l'appliquer quand j'ai lu ton post.


     


    Mais dans quels cas emploie-t'on les fonctions "replaceSubrange"


  • DrakenDraken Membre
    juin 2017 modifié #20


     


    Mais dans quels cas emploie-t'on les fonctions "replaceSubrange"




    a


    Quand il faut modifier partiellement le contenu d'une chaà®ne unique.


     


    Par exemple, remplacer " Stark " par " Targaryen " dans le texte " John Snow est un Stark ! ".


    a



    let texte1 = "Jonh Snow est un Stark ! "
    let texte2 = texte1.replacingOccurrences(of: "Stark", with: "Targaryen")
    print ("Avant : ", texte1)
    print ("Aprés : ", texte2)


    a



     


    Avant :  Jonh Snow est un Stark ! 


    Aprés :  Jonh Snow est un Targaryen ! 


     


     


    a


  • Ok Draken,


     


    Comment fait-on pour obliger le full screen au lancement de l'appli ?


     


    encore une question un peu bête mais comme je ne connais pas encore parfaitement l'interface IB, ça coince.


       


  • Il y a une case à  cocher dans les options du projet.


     


     


  • PatyomPatyom Membre
    juin 2017 modifié #23

    Dans le "Deployment info", je n'ai pas de case à  cocher du nom de "requires full screen".


     


    Cela s'arrête à  "Main Interface" avec "Main" en libellé


     


    Ce ne serait pas spécifique à  IOS ?


  • Hein, quoi il y a quelque chose en dehors d'iOS ? Désolé, je ne sais pas pour MacOS.


  • PatyomPatyom Membre
    juillet 2017 modifié #25

    T'inquiètes pas "FullScreen" c'est un détail, déjà  tout ce que tu m'as expliqué m'a bien aidé, je suis bien la ligne et ma foi j'arrive à  quelque chose.


    Le tout c'est de faire en sorte que ce que je ponds serve aussi dans d'autres appli et c'est çà  qui prend du temps


     


    Merci


     



     


    tout ce que tu m'as expliqué



     


    Oups !!   Je voulais dire "ce que VOUS m'avez expliqué", je n'oublie pas de remercier les autres intervenants.


  • Bonjour,


     


    Si vous aviez à  mettre, dans un programme SWIFT, une variable accessible par tous les ViewControllers et les classes vous la mettriez où ?


  • Joanna CarterJoanna Carter Membre, Modérateur
    Et tu prévois tenir quoi dans la variable ?
  • Bonjour Joanna,


     


    Pour éviter à  avoir à  modifier des variables en dur dans le prog, je créé en fichier un enregistrement avec toutes mes valeurs texte à  l'intérieur et je l'appelle mais comme ces valeurs sont dispersées dans tous les viewcontrollers je ne sais pas à  quel endroit je doit le placer sans que que je n'ai à  l'appeler à  chaque fois.


     


    c'est bon tu as compris, je ne sais pas si c'est clair.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu peux nous montrer du code ?


     


    Attention ! les variables globales brutes sont à  éviter à  tout prix  :-*


  • pourquoi sont-elles à  éviter ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Parce que l'on puisse les modifier d'un endroit sans avoir rendu compte qu'elles étaient déjà  modifiés d'un autre ; surtout avec les applis multi-fils.


Connectez-vous ou Inscrivez-vous pour répondre.