# Ecrire à la suite d'un fichier en AS



## titigrou (13 Février 2017)

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


```
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


----------



## Deleted member 1099514 (13 Février 2017)

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*_


----------



## titigrou (13 Février 2017)

Bah j'ai essayé justement mais ça écrase quand même!


----------



## r e m y (13 Février 2017)

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)


----------



## titigrou (13 Février 2017)

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


```
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!


----------



## r e m y (13 Février 2017)

À la fin de la dernière ligne écrite (à la fin de la ligne 3, puis à la fin de la ligne 3bis dans ton exemple)


----------



## titigrou (13 Février 2017)

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...


----------



## r e m y (13 Février 2017)

Une fois la boucle terminée et que tu en sors, tu ajoutes un retour en fin de fichier


----------



## titigrou (13 Février 2017)

r e m y a dit:


> Une fois la boucle terminée et que tu en sors, tu ajoutes un retour en fin de fichier




C'est ce que je venais d'essayer avant de voir ta réponse!

```
set Contenu_Fichier to Contenu_Fichier & return
```
en sortie de boucle!
Merci infiniment pour ton aide!


----------



## JacqR (13 Février 2017)

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:​

```
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​

```
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


```
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
```


----------



## titigrou (13 Février 2017)

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.

```
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!


----------



## JacqR (13 Février 2017)

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.

```
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.


----------



## titigrou (14 Février 2017)

Nickel ça marche!!
Merci infiniment!
Antoine


----------

