PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → fRenomme() rencontre une erreur
fRenomme() rencontre une erreur
Iniciado por alexion, 24,oct. 2019 15:59 - 7 respuestas
Miembro registrado
117 mensajes
Publicado el 24,octubre 2019 - 15:59
Bonjour à toutes et à tous,

Je réalise une surveillance de répertoire Windows via la fonction fSurveilleRépertoire() et je lance des traitement pour chaque ajout, modification, renommage ou suppression dans le répertoire surveillé

Le but ici est (de surveiller le répertoire (merci captain obvious mais aussi de) créer, modifier ou renommer un fichier .lock lors de chaque ajout, modification, renommage ou suppression de fichier.

Or, lorsque je tente de renommer un fichier, il me le renomme correctement mais je reçois une erreur lorsqu'il tente de renommer le fichier .lock correspondant

Ci-joint le code de ma procédure :

Procedure _ModificationsRépertoire(sNomRépertoire est une chaîne, sNomFichier est une chaîne, nTypeChangement est un entier, sParamètre)

sResAttribut est une chaîne
sMessage est une chaîne
sElément est une chaîne = sNomRépertoire + ["\"] + sNomFichier

SELON nTypeChangement
CAS fsSuppressionFichier
sMessage = ChaîneConstruit("L'élément (fichier ou répertoire) <%1> a été supprimé", sElément)

CAS fsCréationFichier
// On teste l'existence du fichier, s'il n'existe pas, c'est un répertoire
SI fFichierExiste(sElément) = Faux ALORS
// C'est un répertoire
sMessage = ChaîneConstruit("Le répertoire <%1> a été ajouté", sElément)
SINON
SI fExtraitChemin(sElément,fExtension) <> ".lock" ALORS

sMessage = ChaîneConstruit("Le fichier <%1> a été ajouté", sElément)

//sResAttribut = fAttribut(sNomRépertoire + "\" + sNomFichier, "R")

nResCréation est un entier = fCrée(sNomRépertoire + "\" + fExtraitChemin(sNomFichier,fFichier + fExtension) + ".lock")
sResAttribut = fAttribut(sNomRépertoire + "\" + fExtraitChemin(sNomFichier, fFichier+fExtension) + ".lock", "H")

// Info(sNomFichier)

InitialisationFichierINI(sNomRépertoire, sNomFichier)

FIN

FIN

CAS fsRenommage

// On teste l'existence du fichier, s'il n'existe pas, c'est un répertoire
SI fFichierExiste(sElément) = Faux ALORS

// C'est un répertoire
sMessage = ChaîneConstruit("Le répertoire <%1> a été renommé en <%2>", sParamètre, sElément)

SINON

SI fExtraitChemin(sElément,fExtension) <> ".lock" ALORS

SI fRenomme(sNomRépertoire + "\" + sParamètre + ".lock", sElément + ".lock") = Faux ALORS

Info(ErreurInfo(errMessage))

FIN

sMessage = ChaîneConstruit("Le fichier <%1> a été renommé en <%2>", sParamètre, sElément)

FIN

FIN

CAS fsModificationFichier

// On teste l'existence du fichier, s'il n'existe pas, c'est un répertoire
SI fFichierExiste(sElément) = Faux ALORS

// C'est un répertoire
sMessage = ChaîneConstruit("Le répertoire <%1> a été modifié", sElément)

SINON

SI fExtraitChemin(sElément,fExtension) <> ".lock" ALORS

nNuméroVersion est un entier = Val(INILit("INFOBASE", "Version", "", sNomRépertoire + "\" + sNomFichier + ".lock"))
nNuméroVersion += 1

INIEcrit("INFOBASE", "Version", NumériqueVersChaîne(nNuméroVersion), sNomRépertoire + "\" + sNomFichier + ".lock")

sMessage = ChaîneConstruit("Le fichier <%1> a été modifié", sElément)

FIN

FIN

AUTRE CAS

dbgAssertion(Faux,"Notification inconnue")

RETOUR
FIN

AjouteLog(sMessage)


Et ci-joint le screenshot de mon erreur rencontrée :






Comment savoir quel processus utilise le fichier en question et comment faire pour "forcer" le renommage ?

Merci d'avance
Mensaje modificado, 24,octubre 2019 - 16:01
Miembro registrado
160 mensajes
Publicado el 24,octubre 2019 - 16:16
tu peux utiliser l'outil 'sysinternals' de Microsoft pour connaitre les processus qui utilisent le fichier
je pense pas que tu peux forcer le renommage si le fichier est déjà ouvert, mais je suis pas sur attends la réponse des autres
Miembro registrado
4.361 mensajes
Publicado el 24,octubre 2019 - 17:24
Bonjour,
Il est possible que FichierAprèsRenommage.txt.lock, dans ce cas, comme le précise la doc, fRenomme renvoie une erreur

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
7 mensajes
Publicado el 25,octubre 2019 - 08:26
l'erreur indique que tu renommes un fichier dans un autre répertoire, copie et supprime ensuite

--
Christophe
Miembro registrado
1.640 mensajes
Publicado el 25,octubre 2019 - 10:00
Si il le fichier est bloqué.. a part tuer le process en question, a ma connaissance il n'y a pas de possibilités.
Miembro registrado
117 mensajes
Publicado el 25,octubre 2019 - 12:26
j'ai trouvé où se situe mon erreur mais je bien que je comprenne le problème, je ne vois pas comment le solutionner

Lorsque je créé un fichier avec fsCréationFichier, j'ajoute le fichier dans le répertoire et créé en parallèle un fichier .lock que je remplis via la procédure "InitialisationFichierIni". Dans cette procédure, je réalise un ensemble d'instruction INIEcrit() pour remplir mon fichier.

il semblerait que ces instructions ne ferment pas mon fichier et donc je rencontre cette erreur de renommage.

Cependant, je ne vois pas comment, après avoir garni mon fichier .lock, le fermer

J'ai essayé fOuvre() - garnissage - fFerme() mais sans succès

Si quelqu'un connait mieux la fonction INIEcrit(), je l'invite à se faire connaître ^^
Publicado el 25,octubre 2019 - 14:51
Si tu as un doute sur iniecrit tu peux coder la fonction à la main et
fermer ainsi correctement ton fichier.

J'ai du code avec une tempo (2.5s) apres des iniecrit pour être sur que
le fichier soit bien écrit.


Sinon pour une remarque plus générale, tu devrais créer ton fichier.lock
avant de créer ton fichier.txt pour fiabiliser ton traitement (si ce
n'est pas déjà le cas).



eric l.

> Le 25/10/2019 à 10:26, alexion a écrit :
j'ai trouvé où se situe mon erreur mais je bien que je comprenne le
problème, je ne vois pas comment le solutionner

Lorsque je créé un fichier avec fsCréationFichier, j'ajoute le fichier
dans le répertoire et créé en parallèle un fichier .lock que je remplis
via la procédure "InitialisationFichierIni". Dans cette procédure, je
réalise un ensemble d'instruction INIEcrit() pour remplir mon fichier.

il semblerait que ces instructions ne ferment pas mon fichier et donc je
rencontre cette erreur de renommage.

Cependant, je ne vois pas comment, après avoir garni mon fichier .lock,
le fermer

J'ai essayé fOuvre() - garnissage - fFerme() mais sans succès

Si quelqu'un connait mieux la fonction INIEcrit(), je l'invite à se
faire connaître ^^
Miembro registrado
117 mensajes
Publicado el 25,octubre 2019 - 15:14
je ne peux hélas pas créer le .lock avant le .txt car le .lock est créé sur base du .txt

Pour prendre un exemple concret, si je drag un fichier d'un répertoire random et le drop dans le répertoire surveillé par fSurveilleRépertoire(), c'est seulement à ce moment qu'il va créer le fichier .lock.

Et oui, je pense que je vais essayer de partir sur un fOuvre() -> fEcrit() -> fFerme() plutôt que l'utilisation de INIEcrit()

Merci pour vos réponses rapides et éclairées