[..] Problème d'de création de fichier.txt

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
jeanmimigab
Niveau 5
Niveau 5
Messages : 123
Enregistré le : sam. 08 oct. 2011 14:01
Status : Hors ligne

[..] Problème d'de création de fichier.txt

#1

Message par jeanmimigab »

Bonjour à tous(tes),

Dans mon script j'ai un souci d'édition de fichiers.txt, je ne comprend pas ce qui cloche car certains fichiers se créés bien et d'autres ne son pas créés.
Je précise que le problème se fait uniquement quand le script est exécuté sur une partition de serveur. Je pensais au début à un problème de droit en écriture car le script fonctionne bien sur le disque local de mon pc, mais le fait est que certains fichiers arrivent quand même à ce créer et d'autres non...
Pour info le fichier "nni.txt" est bien généré.
Le fichier qui pose problème est le fichier "message.txt"
Peut être que le script cloche quelque part...
Si un(e) de vous a une idée, je suis preneur.. :wink:
Merci d'avance... :wink:

voici le script
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=icone.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <ComboConstants.au3>
#include <File.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <date.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$sDate = _NowDate ( )
$sTime = _NowTime ( )
DirCreate(@ScriptDir &"\archives\")

#Region ### START Koda GUI section ### Form=C:\Users\jeanmimi\Desktop\liveup\admin2.kxf
Global $Form1 = GUICreate("Live-Up Administrateur", 528, 597, 224, 232)
Global $MenuItem2 = GUICtrlCreateMenu("&Menu")
Global $MenuItem4 = GUICtrlCreateMenuItem("Tutoriel", $MenuItem2)
Global $MenuItem3 = GUICtrlCreateMenuItem("Archives LiveUp", $MenuItem2)
GUISetBkColor(0xFFFFFF)
Global $Group1 = GUICtrlCreateGroup("   Saisir votre message   ", 16, 100, 377, 313)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Input1 = GUICtrlCreateEdit("", 40, 140, 329, 201)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Button1 = GUICtrlCreateButton("Envoyer le message", 104, 352, 211, 41)

; Listing dossiers
Global $aScriptDir = _FileListToArray(@ScriptDir, "*", $FLTA_FOLDERS, 0)

Global $sFilePath = @ScriptDir & "\nni.txt"

;export du noms des dossiers nni dans fichier nni.txt
_FileWriteFromArray($sFilePath, $aScriptDir, 1)

Global $liste = GUICtrlCreateEdit("", 408, 140, 97, 257, $ES_AUTOVSCROLL + $WS_VSCROLL)
Global $Read1 = FileRead (@ScriptDir & "\nni.txt")
GUICtrlSetData($Liste, $Read1, 1)
Global $Group2 = GUICtrlCreateGroup("  Contacts  ", 400, 100, 113, 313)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Pic1 = GUICtrlCreatePic("liveup.JPG", 104, 16, 329, 79)
Global $Pic2 = GUICtrlCreatePic("vague.JPG", 0, 416, 527, 160)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$msg = GUIGetMsg()
Select
   Case $msg = $GUI_EVENT_CLOSE
Exit
   Case $msg = $Button1
      Valider()
   Case $msg = $MenuItem4
      Tuto()
   Case $msg = $MenuItem3
      Rapport()
EndSelect
WEnd


Func Valider()
$valideur = @UserName
$ecri2 = guictrlread($Input1)
Local $Source = @ScriptDir & "\message.txt"
   if $ecri2 <> "" then

      _FileCreate($Source)
Local $hFileOpen = FileOpen($Source, $FO_READ)
      FileWrite($Source,$ecri2)
      FileClose($Source)
      MsgBox(0, "test ok", "Message édité avec succès ! ", 3)
   copie()
Exit
;suite script si zone saisie vide
   Else
      MsgBox(0, "Attention", " Vous devez remplir la partie " & '"' & "Saisir votre message" & '"' & " avant de valider" )
   EndIf
EndFunc

Func copie()
$sDate = _NowDate ( )
$sTime = _NowTime ( )
$DateDeMonRDV2 = $sDate
$formatEN2 = StringRegExpReplace($DateDeMonRDV2, '(\d{2})/(\d{2})/(\d{4})', "$3/$2/$1")
$sNewDatej2 = _DateAdd('d', 0, $formatEN2)
$formatFRj2 = StringRegExpReplace($sNewDatej2, '(\d{4})/(\d{2})/(\d{2})', "$3/$2/$1")
$ecrij2 = StringReplace($formatFRj2, "/", ".")
$newtime = StringReplace($sTime, ":", "_")
Local $archives = @ScriptDir & "\archives\" & $ecrij2 & "-" & $newtime & ".txt"
Local $Source = @ScriptDir & "\message.txt"
Local $SourceDel = @ScriptDir & "\archives\message.txt"
Local $FileList = _FileListToArray(@ScriptDir, "*", $FLTA_FOLDERS, 1)
   For $i = 1 to $FileList[0]
      FileCopy($Source, $FileList[$i], $FC_OVERWRITE)
      FileCopy($Source, @ScriptDir & "\archives\" & $sDate & $sTime & ".txt", BitOR($FO_ANSI, $FO_APPEND, $FO_CREATEPATH))
      FileCopy($Source, $archives)

   Next
      FileDelete($Source)
      FileDelete($SourceDel)
EndFunc


Func Tuto()
   ShellExecute(@scriptdir & "\tutoriel_LiveUp.pdf")
EndFunc

Func Rapport()
   ShellExecute(@scriptdir & "\archives")
EndFunc
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#2

Message par Tlem »

Bonsoir. Je suis assez surpris qu'en locale cela fonctionne, car là il y à un gros problème :shock: :

Code : Tout sélectionner

               _FileCreate($Source)
Local $hFileOpen = FileOpen($Source, $FO_READ)
                FileWrite($Source,$ecri2)
                FileClose($Source)
Si je résume :
1 - Vous créez un fichier "message.txt" vide (sans vérifier qu'il a bien été créé) !
2 - Vous créez un handle de fichier en lecture pour le fichier "message.txt" (toujours sans vérifier si cela à fonctionné) !
3 - Vous essayez d'écrire directement dans le fichier (Le handle, c'était pour le fun).
4 - Vous fermez un fichier qui a déjà été fermé par la fonction précédente ...

Quelle accumulation d'erreurs. :roll:

Bon, après j'ai survolé très rapidement le code car franchement, ça pique. J'ai pas cherché toutes les erreurs, mais simplement en faisant le copier/coller, j'ai vu ceci :
Dans la fonction Valider(), vous déclarez :

Code : Tout sélectionner

$valideur = @UserName
Ok mais pourquoi diantre, vous n'utilisez pas cette variable dans la fonction. Sans compter la non utilisation de la déclaration "Local" alors que vous le faites ailleurs.

Code : Tout sélectionner

blablabla
Local $archives = @ScriptDir & "\archives\" & $ecrij2 & "-" & $newtime & ".txt"
Local $Source = @ScriptDir & "\message.txt"
Local $SourceDel = @ScriptDir & "\archives\message.txt"
Local $FileList = _FileListToArray(@ScriptDir, "*", $FLTA_FOLDERS, 1)
       For $i = 1 to $FileList[0]
                FileCopy($Source, $FileList[$i], $FC_OVERWRITE)
                FileCopy($Source, @ScriptDir & "\archives\" & $sDate & $sTime & ".txt", BitOR($FO_ANSI, $FO_APPEND, $FO_CREATEPATH))
                FileCopy($Source, $archives)

        Next
                FileDelete($Source)
                FileDelete($SourceDel)
EndFunc
A quoi vous sert l'initialisation en locale des variables $archives et $SourceDel alors qu'elles ne sont utilisées qu'une seule fois dans la fonction sans compter que $Source est aussi déclaré dans l'autre fonction. :shock:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jeanmimigab
Niveau 5
Niveau 5
Messages : 123
Enregistré le : sam. 08 oct. 2011 14:01
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#3

Message par jeanmimigab »

Bonsoir Tlem,
ce script avait été modifié pour test (donc un peu en free style) , mais je t'assure qu'il fonctionne bien (faut croire que les dieux de l'informatique sont avec moi :mrgreen: ) car le fichier message.txt est bien créer dans @ScriptDir avec le contenu de "$Input1" et copier dans tous les dossiers )
Je vais rajouter le contrôle des étapes pour voir...
à l'origine le script de la fonction "valider" était celui ci-dessous
Func Valider()

$valideur = @UserName
$ecri2 = guictrlread($Input1)
   if $ecri2 <> "" then

      _FileCreate(@ScriptDir & "\message.txt")
      Local $file2 = FileOpen(@ScriptDir & "\message.txt", BitOR($FO_ANSI, $FO_APPEND, $FO_CREATEPATH))
      FileWrite($file2,$ecri2)
     
MsgBox(0, "test ok", "Message édité avec succès ! ", 3)
      copie()
Exit
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#4

Message par orax »

Pour avoir des détails sur l'erreur, tu peux utiliser _WinAPI_GetLastErrorMessage.

Code : Tout sélectionner

#include <WinAPI.au3>
If Not FileWrite("a:\test.txt", "test") Then
	ConsoleWrite(_WinAPI_GetLastErrorMessage() & @CRLF) ; affiche l'erreur s'il y en a une
EndIf
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jeanmimigab
Niveau 5
Niveau 5
Messages : 123
Enregistré le : sam. 08 oct. 2011 14:01
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#5

Message par jeanmimigab »

Bonsoir Orax,

Merci pour l'info, ça va me faire gagner du temps...

@Tlem, désolé si je t'ai filer la migraine avec mon script :mrgreen:

bonne soirée à tous :wink:
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#6

Message par Tlem »

Re,
Bien que le deuxième code présenté soit plus près de la vérité, il n'en comporte pas moins "deux erreurs".

_FileCreate() sert juste à créer un fichier vide. Cette fonction ouvre puis ferme le fichier.

FileOpen() fait plus ou moins la même chose. Dans le cas présenté, il ouvre le fichier afin d'ajouter du texte à la suite d'un éventuel texte déjà existant dans le fichier. Mais avec les bons paramètres, il peux aussi créer le fichier et le préparer pour l'écriture. Par contre cette fonction nécessite l'utilisation d'un FileClose() après avoir terminé d'écrire dans le fichier et dans votre deuxième code, on ne retrouve pas cette fermeture.
Cette fonction retourne une valeur qui correspond au handle du fichier pour utilisation avec les fonctions de lecture ou d'écriture selon le cas et surtout elle retourne -1 en cas d'erreur, ce qui permet de savoir s'il fait continuer d'écrire dans le vide ou non !!!

Pour terminer, FileWrite() sert comme vous le savez à écrire dans un fichier. Mais si vous ne réutilisez pas le handle précédemment ouvert, et bien la fonction ouvre puis ferme ce fichier !!!

Donc soit vous utilisez conjointement FileOpen(), FileWrite() et FileClose() soit vous utilisez directement FileWrite()
Dans votre cas, FileWrite() suffit largement. Juste à rajouter le contrôle de l'écriture (If Not FileWrite(....) Then .....

Pas de problème pour le mal de tête, je joue actuellement avec un Raspberry Pi 3 + Jeedom et c'est pour moi (utilisateur de Windows) bien plus casse tête. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jeanmimigab
Niveau 5
Niveau 5
Messages : 123
Enregistré le : sam. 08 oct. 2011 14:01
Status : Hors ligne

Re: [..] Problème d'de création de fichier.txt

#7

Message par jeanmimigab »

Bonsoir Tlem,

ha oui je comprend mieux maintenant...je vais modifier et voir ce que cela donne...

Tes explications sont très précise et me font mieux comprendre les erreurs commises.

Un grand merci à vous tous et je vous tient au courant des nouveau résultats des tests.

Bonne soirée et bon WE :wink:
Répondre