Ecrire à la suite d'un fichier en AS

titigrou

Membre expert
Club iGen
23 Décembre 2004
1 091
26
40
Lille
Hello,

J'ai un programme qui traite des données et formate un fichier en sortie avec des résultats.
Le code pour l'écriture est le suivant

Bloc de code:
set Contenu_Fichier to Contenu_Fichier & item i of liste_livres & ";" & item i of liste_dates_emprunt & ";" & item i of liste_heures_emprunt & ";" & Etat_disponibilite & return
       
    end repeat
   
   
   
end repeat

-- Debut ecriture du fichier de sortie

set thePath to "/Users/Antoine/Desktop/ProgrammeLivres/Fichiersortie.txt"
try
    set openfile to open for access thePath with write permission
    set eof of openfile to 0 -- efface le contenu du fichier s'il le fichier contient déjà du texte
    write Contenu_Fichier to openfile as «class utf8»
    close access openfile
on error
    try
        close access thePath
    end try
end try

J'aimerai, si je lance mon programme deux fois, que les résultats du second lancement s'écrivent à la suite du premier fichier de sortie, et non pas qu'il soit écrasé.
C'est possible?

Bonne journée et merci!

Antoine
 
Salut

C'est pas cette commande qu'il faut supprimer?
set eof of openfile to 0 -- efface le contenu du fichier s'il le fichier contient déjà du texte
 
Après avoir supprimé la ligne set eof of openfile to 0
Il faut modifier la ligne Write pour spécifier d'écrire en commençant à la fin du fichier (plutôt qu'au début)

write Contenu_Fichier to openfile starting at (get eof of openfile)
 
  • J’aime
Réactions: jeanjd63
Nickel ça marche! Merci beaucoup!
Par contre, juste un détail, quand je teste avec 3 lignes dans mon fichier, une première fois, puis une seconde fois, je me retrouve avec
Ligne 1
Ligne 2
Ligne 3 Ligne 1 bis
Ligne 2 bis
Ligne 3 bis

En gros, il faudrait faire un return à la fin de l'écriture pour que la ligne 1 bis soit sur une nouvelle ligne, mais je vois pas trop comment et où mettre mon return du coup!

Je pensais le mettre au début de mon

Bloc de code:
set Contenu_Fichier to Contenu_Fichier & return & item i of liste_livres & ";" & item i of liste_dates_emprunt & ";" & item i of liste_heures_emprunt & ";" & Etat_disponibilite & return
mais là j'aurai une ligne vierge entre tous mes enregistrements!
 
À la fin de la dernière ligne écrite (à la fin de la ligne 3, puis à la fin de la ligne 3bis dans ton exemple)
 
Oui mais le soucis c'est que mon écriture se fait dans une boucle avec un repeat!
A moins que je dissocie le dernier cas avec un if...
 
Une fois la boucle terminée et que tu en sors, tu ajoutes un retour en fin de fichier
 
Bonjour,

Information sur la commande write:
Si vous ne spécifier pas la position de départ dans le fichier, ce sera au début du texte., mais il n'écrasera pas nécessairement tout le texte:
Exemple:​
Bloc de code:
    set openfile to open for access thePath with write permission
    set eof of openfile to 0 -- efface le contenu du fichier s'il le fichier contient déjà du texte
    write "123456" to openfile as «class utf8» -- écrit 6 caractères dans le fichier


Après, vous exécuter ce script​
Bloc de code:
    set openfile to open for access thePath with write permission
    write "aaa" to openfile as «class utf8»

Le texte dans le fichier sera "aaa456", car le script a écrit 3 caractères dans un fichier qui en contenait 6.
Par contre si le script écrit 6 caractères ou plus, le texte au complet sera écrasé par les nouveaux caractères.​



Donc, le script sera ce que remy vous a suggéré starting at (get eof of openfile), ou comme ceci starting at eof

Bloc de code:
try
    set openfile to open for access thePath with write permission
    write Contenu_Fichier to openfile starting at eof as «class utf8» -- écrit à la fin du fichier
    close access openfile
on error
 
Par contre, et ça reprend un post que j'avais fait sur lequel JacqR m'avait débloqué (pour l'encodage du fichier de sortie) mon code final ressemble à ça.
Bloc de code:
set thePath to "/Users/Antoine/Desktop/Fichier01.txt"
try
    set tempPath to thePath & "--temp_xyz" -- fichier temporaire
    set openfile to open for access tempPath with write permission
    write Contenu_Fichier to openfile starting at (get eof of openfile)
    close access openfile
   
    -- conversion d'un fichier en Mac Roman (mais inconnu par les autres applications) en un fichier encodé en iso latin 1 (cet encodage sera connu par les autres applications)
    do shell script "iconv -t CSISOLATIN1 -f MACROMAN " & (quoted form of tempPath) & " > " & (quoted form of thePath) & " && rm " & quoted form of tempPath -- à la fin on supprime le fichier temporaire
   
on error
    try
        --close access thePath
        close access tempPath
    end try
end try
et le soucis c'est que quand je lance le programme deux fois, ça écrase bien l'ancien fichier!
 
La commande write écrit dans un fichier temporaire et ce fichier sera supprimé, c'est la commande iconv qui écrase le fichier original.

Pour écrire à la fin du texte dans le fichier original, la modification doit se faire dans la commande `do shell script`, comme ceci.
Bloc de code:
do shell script "iconv -t CSISOLATIN1 -f MACROMAN " & (quoted form of tempPath) & " >> " & (quoted form of thePath) & " && rm " & quoted form of tempPath -- à la fin on supprime le fichier temporaire

La différence est " >> " au lieu de " > "
" >> "
cela veut dire écrire à la fin du texte dans le fichier.
" > " ceci écrasera le texte dans le fichier.