[Irrésolu/Clos] Problème avec RenameFile()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[Irrésolu/Clos] Problème avec RenameFile()

Message par boddhi »

Bonsoir à la communauté...

J'ai besoin de vos lumières (les miennes ont fini par griller :oops:) !

je rencontre un problème avec l'instruction RenameFIle() utilisée dans une boucle dans un thread.
J'ai invariablement un retour d'erreur de "violation de partage" (Code 32 : "ERROR_SHARING_VIOLATION" récupérée via GetLastError_()).

Ma ligne de commande initiale (Note pour la compréhension du code : la référence au fichier source provenant d'une liste est utilisée avec With) :

Code : Tout sélectionner

Resultat=RenameFile(\AncienNomFichier(),NouveauNomFichier)
je précise que les références aux fichiers source et cible sont correctes, que le fichier source ne possède aucun attribut ou privilège qui empêcherait son renommage et que l'un et l'autre se situent dans le même répertoire.

J'ai donc ajouté en amont et en aval quelques lignes pour déterminer d'où pouvait venir le problème :

Code : Tout sélectionner

; Je teste si le fichier source est utilisé par un autre processus
handle=CreateFile_(\AncienNomFichier(),#GENERIC_READ,0,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null)
If handle=#INVALID_HANDLE_VALUE
  MessageRequester("Echec opération",Str(GetLastError_()))
Else
  CloseHandle_(handle)
  ; ici, j'ai un retour '0' donc, normalement, le fichier n'est pas 'bloqué...
  MessageRequester("Réussite opération",Str(GetLastError_()))
EndIf

; Je teste le dernier code GetLastError_() et j'obtiens '0'
MessageRequester("Test",Str(GetLastError_()))

; Je tente de renommer le fichier 
Resultat=RenameFile(\AncienNomFichiers(),NouveauNomFichier)

; Ici, j'affiche le résultat et j'obtiens 0 (Echec) sur la 1e ligne et 32 (violation de partage) sur la seconde
MessageRequester("Résultat",Str(Resultat)+Chr(10)+Str(GetLastError_()))

Or, quand je lance la même instruction avec les fichiers source et cible saisis littéralement dans un nouveau projet avec pour unique ligne :

Code : Tout sélectionner

Resultat=RenameFile("\\?\D:\Ancien.txt","\\?\D:\Nouveau.txt") ; Retour Resultat=1 (Réussite)
la commande fonctionne parfaitement et le fichier est renommé sans problème ! 8O

Quelqu'un aurait-il une piste ?
Merci.
Dernière modification par boddhi le mar. 06/déc./2022 13:01, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec RenameFile()

Message par Ar-S »

Salut.
Des idées en vrac
- Ne devrais tu pas mettre ton CloseHandle_(handle) après ton endif ?
- Est-ce que tes fichiers ne sont pas dans des dossiers protégés ?
- As tu essayer d’exécuter ton prog avec les droits admin ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

Bonjour Ar-S
- Ne devrais tu pas mettre ton CloseHandle_(handle) après ton endif ?
Non car j'obtiendrais une erreur comme, par ex., lors d'un : If OpenWindow(Numero,....): ... :Else: ... :Endif : CloseWindow(Numero).
- Est-ce que tes fichiers ne sont pas dans des dossiers protégés ?
Non, j'ai bien précisé que les fichiers source n'avaient aucun attribut ou privilège qui empêcheraient leur renommage
- As tu essayer d’exécuter ton prog avec les droits admin ?
Non, car je n'en vois pas l'intérêt dans la mesure où l'utilisateur (moi) qui a créé les fichiers est le même que celui (moi) qui tente de les renommer :wink:

Pour les deux dernières hypothèses, bien sûr, j'avais envisagé (certes sans grande conviction pour les raisons invoquées précédemment) un truc du genre mais elles sont invalidées puisque :
Or, quand je lance la même instruction avec les fichiers source et cible saisis littéralement dans un nouveau projet avec pour unique ligne :

Code : Tout sélectionner

Resultat=RenameFile("\\?\D:\Ancien.txt","\\?\D:\Nouveau.txt") ; Retour Resultat=1 (Réussite)
la commande fonctionne parfaitement et le fichier est renommé sans problème !
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Problème avec RenameFile()

Message par Marc56 »

Ce n'est pas le même fichier que tu testes et que tu tente de renommer ensuite:

\AncienNomFichiers() est écrit avec un s la deuxième fois.

:idea: EnableExplicit :wink:

Ensuite, si CreateFile est OK, alors le fichier est créé et il faut donc le libérer (CloseFile) avant de tenter de le renommer.

Le gestionnaire de tâche montre si un fichier est ouvert en plus du programme qui l'a ouvert.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

Bonjour Marc56,
Ce n'est pas le même fichier que tu testes et que tu tente de renommer ensuite:
\AncienNomFichiers() est écrit avec un s la deuxième fois.
Pardon ! C'est une coquille de ma part lors de la rédaction du post ! Dans mon code originel, Il n'y a aucun problème avec les noms de fichiers.
(sinon, d'ailleurs, j'aurais une erreur GetLastError_() = 2 'fichier non trouvé' et non 32 'violation de partage')
Ensuite, si CreateFile est OK, alors le fichier est créé et il faut donc le libérer (CloseFile) avant de tenter de le renommer.
Le CloseHande_() accomplit normalement, d'après mes connaissances (très limitées :D ) en API Windows, cette tâche, non ?
En réalité, la portion de code " Handle=CreateFile_().... : Endif " n'est là que pour tenter de comprendre pourquoi la commande RenameFile() ne fonctionne pas et ne figure pas dans mon source originel dysfonctionnel (C'est pourquoi j'avais d'ailleurs précisé : "J'ai donc ajouté en amont et en aval quelques lignes pour déterminer d'où pouvait venir le problème" :wink: ).
Le gestionnaire de tâche montre si un fichier est ouvert en plus du programme qui l'a ouvert
Tu peux m'expliquer comment tu fais ? Parce que quand je vais dans le gestionnaire et que je consulte le détail de la ligne 'PureBasic_CompilationX.exe' je ne vois aucune info...

En résumé, la première conclusion qui me vient à l'esprit à l'analyse du code, c'est que la commande RenameFile(), au moment où elle est initiée, semblerait (j'insiste bien sur 'semblerait' :) ) créer pour une raison inexpliquée un blocage au niveau du fichier source.
Serait-ce dû à son utilisation dans un thread ? Et vu qu mes connaissances en matière de thread sont quasi nulles...
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Problème avec RenameFile()

Message par MLD »

@boddhi
L'api concernant CloseHandle dit ceci:
Description: Ferme un objet de noyau, tel que les objets de fichier, de mapping de fichier, de processus, de threds, de sécurité et de synchronisation.
Commentaires: Un objet de noyau n'est supprimé que lorsque toutes les références a cet objet sont fermées. :roll:
Perso: Je fermerais d’abord le fichier avec close, avant l'utilisation de RenameFile. Je n'utilise jamais CloseHandle pour fermer un fichier.
Le fait que tu l'utilise dans un thred ne doit pas arrangé les choses.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec RenameFile()

Message par Ar-S »

utilisée dans une boucle dans un thread.
Laisses tu le temps entre 2 passages de renommer le fichier ?
Tu as essayé un delay(1000) entre chaque boucle histoire de voir ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

Bonjour MLD

Pourquoi utiliser la commande CloseFile puisque je n'ai pas utilisé la commande PB CreateFile mais l'API 'CreateFile_', (sans parler de pouvoir récupérer le FileID PB du fichier pour argumenter CloseFile) ?
L'API CreateFile dit aussi :
When an application is finished using the object handle returned by CreateFile, use the CloseHandle function to close the handle. This not only frees up system resources, but can have wider influence on things like sharing the file or device and committing data to disk. Specifics are noted within this topic as appropriate.
Aurais-je mal interprété la doc ?
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Problème avec RenameFile()

Message par Marc56 »

Hello,

Si je simplifie ton programme (toujours donner des exemples qui fonctionnent svp)

Code : Tout sélectionner

File$ = GetTemporaryDirectory() + "Test.txt"

handle=CreateFile_(File$,#GENERIC_READ,0,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null)
If handle=#INVALID_HANDLE_VALUE
  MessageRequester("Echec opération",Str(GetLastError_()))
Else
  CloseHandle_(handle)
  MessageRequester("Réussite opération",Str(GetLastError_()))
EndIf
Ton code ne donne ne donne que deux états différents
2 - Le programme n'existe pas (FileSize() aurait donné -1 sans avoir à ouvrir/fermer)
0 - Il existe et peu importe qu'il soit ouvert ou pas, même code.
:wink:
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

@Ar-S
Tu as essayé un delay(1000) entre chaque boucle histoire de voir ?
Oui, avec même une valeur de 5000, c'est dire ! :D mais toujours le même problème...
Ce qui est vraiment étrange c'est que le blocage se produit dès le premier fichier !!!
Voilà une portion plus grande de mon code :

Code : Tout sélectionner

with *ArgThread
  ...
        If MessageRequester(DonneesTraitement\TitreMessage,"Procéder au renommage de "+Str(DonneesTraitement\NbFichiers)+" fichier(s) ?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)=#PB_MessageRequester_Yes

       	  ; Ici, changement d'une partie des gadgets d'une fenêtre DialogXML
          Pc_Gestion_AffichageCTParametresOptions(#GAD_FP_CT_CPSTRAITEMENT)

          ; Ici, alimentation de variables dédiées à un PostEvent ultérieur
          DonneesTraitement\Contexte=#GAD_FP_CT_CPSTRAITEMENT
          DonneesTraitement\TypeInfos=#RF_AFFICHAGE_COMPTEUR|#RF_AFFICHAGE_FICHIERSOURCE|#RF_AFFICHAGE_FICHIERCIBLE
          DonneesTraitement\NbTotalFichiers=DonneesTraitement\NbFichiers:DonneesTraitement\NbFichiers=0

          ; Ici, affichage d'une barre de progression, avec sa limite haute, sur la fenêtre DialogXML
          Pc_Affichage_JaugeProgression(DonneesTraitement\NbTotalFichiers)
          
          ; La boucle principale... (était-il besoin de le préciser ?  :D )
          ResetList(\Fichiers())
          While NextElement(\Fichiers())

            ; Idem, alimentattion de variables pour un PostEvent
            DonneesTraitement\NbFichiers+1
            DonneesTraitement\Dossier=GetPathPart(\Fichiers())
            DonneesTraitement\FichierSource=GetFilePart(\Fichiers())
            DonneesTraitement\FichierCible=""
            DonneesTraitement\TypeInfos=#RF_AFFICHAGE_DOSSIER|#RF_AFFICHAGE_FICHIERSOURCE|#RF_AFFICHAGE_FICHIERCIBLE|#RF_AFFICHAGE_COMPTEUR|#RF_AFFICHAGE_JAUGE

            ; Ici, le fameux PostEvent où j'alimente des StringGadget et une ProgressBarGadget
            PostEvent(#EVTD_EXAMENDOSSIER_AFFICHAGEINFOS)
            Delay(4)

            ; Ici, quelques bidouilles sur les variables
            DonneesTraitement\FichierCible=ReplaceString(GetFilePart(DonneesTraitement\FichierSource,#PB_FileSystem_NoExtension),\ChaineCherchee,\ChaineRemplacement,\ModeCasse)
            If GetExtensionPart(DonneesTraitement\FichierSource)<>"":DonneesTraitement\FichierCible+"."+GetExtensionPart(DonneesTraitement\FichierSource):EndIf

            ; Ici, je teste si le nom du fichier cible est différent de celui du fichier source
            If DonneesTraitement\FichierCible<>DonneesTraitement\FichierSource
              Fichier.s=DonneesTraitement\Dossier+DonneesTraitement\FichierCible

; Les lignes de commandes ci-dessous jusqu'au commentaire '; XXX' ne sont pas dans le code originel
; Elles ne sont là que pour le débogage de mon souci et déterminer l'état du fichier source avant l'opération RenameFile()
	      
	      ; Je stoppe temporairement le thread
              Pc_Thread_Pause(*ThreadExamenDossier)

              ; J'affiche l'état actuel de GetLastError() qui me renvoie 0
              MessageRequester(Str(Resultat),Str(GetLastError_()))
              Define handle

              ; Je teste s'il y a problème quelconque avec le fichier => Idem le retour est toujours 0
              handle=CreateFile_(\Fichiers(),#GENERIC_READ,0,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null)
              If handle=#INVALID_HANDLE_VALUE
                 MessageRequester("Echec opération",Str(GetLastError_()))
              Else

                ; Le retour 0 se produit à ce niveau 
                CloseHandle_(handle)
                MessageRequester("Réussite opération",Str(GetLastError_()))
              EndIf   

	      ; Je réactive le thread
              Pc_Thread_Reprise(*ThreadExamenDossier)

; XXX
	       ; Ici, retour au code originel et l'objet de mon drame capillotracté !!!  :D 
               Resultat=RenameFile(\Fichiers(),Fichier) ; Retourne toujours 0
               Delay(1000) ; Ici, j'avais mis 500 à un moment donné

               ; Ici, je réinterroge GetLastError() qui me renvoie systématiquement 32 'violation de partage' même lors du traitement du 1er fichier (et je précise que, dans ce test, il n'existe aucun fichier portant le même nom que le fichier cible !)
              MessageRequester("Résultat",Str(Resultat)+Chr(10)+Str(GetLastError_()))

              ; Le code qui suit est prévu, à l'origine, pour trouver et proposer un nouveau de nom de fichier dans l'éventualité où un autre fichier porterait déjà le même nom que le fichier cible
              If Resultat=0
                NouvChaineRemplacement=Pc_RechercheNouveauNomFichier(Fichier)
                If NouvChaineRemplacement=""
                  MessageRequester(DonneesTraitement\TitreMessage,Str(Resultat)+" "+"Impossible de renommer :"+Chr(10)+"    '"+\Fichiers()+"'"+Chr(10)+"en"+Chr(10)+"    '"+Fichier+"'"+Chr(10)+Chr(10)+"Vérifier que le nouveau nom n'existe pas déjà dans le dossier !",#PB_MessageRequester_Warning)
                Else
                  If MessageRequester(DonneesTraitement\TitreMessage,Str(Resultat)+" "+"Impossible de renommer :"+Chr(10)+"    '"+\Fichiers()+"'"+Chr(10)+"en"+Chr(10)+"    '"+Fichier+"'"+Chr(10)+Chr(10)+"Tenter de le renommer en : "+Chr(10)+"    '"+NouvChaineRemplacement+"' ?",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)=#PB_MessageRequester_Yes
                    If RenameFile("\\?\"+\Fichiers(),"\\?\"+NouvChaineRemplacement)=0
                      MessageRequester(DonneesTraitement\TitreMessage,"Impossible de renommer :"+Chr(10)+"    '"+\Fichiers()+"'"+Chr(10)+"en"+Chr(10)+"    '"+NouvChaineRemplacement+"'"+Chr(10)+Chr(10)+"Vérifier que le nouveau nom n'existe pas déjà dans le dossier !",#PB_MessageRequester_Warning)
                    Else

                      ; Ici, RE, j'alimente des variables pour un PostEvent qui modifie la valeur d'un StringGadget
                      DonneesTraitement\NbFichiersTraites+1
                      DonneesTraitement\TypeInfos=#RF_AFFICHAGE_FICHIERCIBLE
                      DonneesTraitement\FichierCible=GetFilePart(NouvChaineRemplacement)
                      PostEvent(#EVTD_EXAMENDOSSIER_AFFICHAGEINFOS)
                      Delay(4)
                    EndIf
                  EndIf
                EndIf
              Else

                ; Ici, idem, j'alimente des variables pour un PostEvent qui modifie la valeur d'un StringGadget
                DonneesTraitement\NbFichiersTraites+1
                DonneesTraitement\TypeInfos=#RF_AFFICHAGE_FICHIERCIBLE
                PostEvent(#EVTD_EXAMENDOSSIER_AFFICHAGEINFOS)
                Delay(4)
              EndIf
            EndIf
          Wend
        EndIf
      EndIf
  ...
EndWith
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

@Marc56

Peut-être n'ai-je pas bien compris ce que tu tentes de m'expliquer mais si je provoque volontairement un blocage en créant un fichier avec la commande CreateFile(), en ne le fermant pas et en lançant ensuite l'API CreateFile_(), j'ai bien en retour un code GetLastError_() 32 :

Code : Tout sélectionner

File$ = GetTemporaryDirectory() + "Test.txt"
If CreateFile(0,File$)
  handle=CreateFile_(File$,#GENERIC_READ,0,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null)
  If handle=#INVALID_HANDLE_VALUE
    If GetLastError_()=32
      MessageRequester("Echec opération",Str(GetLastError_())+" "+"Violation de partage")
    Else
      MessageRequester("Echec opération",Str(GetLastError_()))
    EndIf
  ElseIf handle=#ERROR_SHARING_VIOLATION
  Else
    CloseHandle_(handle)
    MessageRequester("Réussite opération",Str(GetLastError_()))
  EndIf
  CloseFile(0)
  DeleteFile(File$)
EndIf
Maintenant si je le ferme juste après l'avoir créé, j'ai bien GetLastError_() = 0

Code : Tout sélectionner

File$ = GetTemporaryDirectory() + "Test.txt"
If CreateFile(0,File$)
   CloseFile(0)
  handle=CreateFile_(File$,#GENERIC_READ,0,#Null,#OPEN_EXISTING,#FILE_ATTRIBUTE_NORMAL,#Null)
  If handle=#INVALID_HANDLE_VALUE
    If GetLastError_()=32
      MessageRequester("Echec opération",Str(GetLastError_())+" "+"Violation de partage")
    Else
      MessageRequester("Echec opération",Str(GetLastError_()))
    EndIf
  ElseIf handle=#ERROR_SHARING_VIOLATION
  Else
    CloseHandle_(handle)
    MessageRequester("Réussite opération",Str(GetLastError_()))
  EndIf
  DeleteFile(File$)
EndIf
Donc j'en conclus que si le retour de GetLastError_() est :
  • 0, le fichier existe et qu'il n'a aucun souci pour y accéder,
  • 2, le fichier n'existe pas
  • 32, le fichier existe mais on ne peut pas y accéder
Donc dans mon code,

Code : Tout sélectionner

Handle=createFile_()
....
EndIF

MessageRequester("Résultat",Str(Resultat)+Chr(10)+Str(GetLastError_())) n'a été détecté par CreateFile_()
; Si ici GetLastError_() me retourne 0, j'en conclus donc qu'il n'y a aucun blocage en cours sur mon fichier source

Resultat=RenameFile(\Fichiers(),Fichier+"tmp")
; Ici, j'obtiens 0 donc la commande ne s'est pas exécutée correctement

MessageRequester("Résultat",Str(Resultat)+Chr(10)+Str(GetLastError_()))
; Ici, GetLastError_() me retourne 32, j'en conclus donc qu'il s'est produit un blocage entre les 2 GetLastError_(), donc avec RenameFile().
Es-tu d'accord avec moi jusque-là ou me trompé-je ?

Or, le plus étrange, c'est que je n'ai aucune commande interne ou processus externe accédant au fichier avant la commande RenameFile() => ??? 8O
(Je reprécise que ce phénomène se produit même dans mon code originel qui ne contient pas la partie Handle=CreateFile_()...EndIf)
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Problème avec RenameFile()

Message par Marc56 »

Problème déjà posé en 2011 et sans solution fiable.
https://www.purebasic.fr/english/viewtopic.php?t=44978
:wink:
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

@Marc56

Merci pour ta recherche.
J'en ai fait des tas sur les forums anglais et allemand mais, celui-là, je ne l'ai pas vu !
Je vais y jeter un coup d'oeil.
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Problème avec RenameFile()

Message par TazNormand »

Salut

dans tes recherches de solutions, es-tu tombé sur ce post StackOverflow ?
CreateFile fails with error ERROR_SHARING_VIOLATION
Image
Image
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Problème avec RenameFile()

Message par boddhi »

Bonsoir TazNormand

Non, pas du tout... Pour être honnête, je n'ai pas une tendance naturelle à me diriger tout de go vers du code C++ quand j'en vois :oops: :D
Je n'ai jamais pris (ou eu) le temps de m'y intéresser.

Toutefois, j''étais tombé, au hasard de mes recherches, sur https://www.easefilter.com/kb/fileapi-getfilesize.htm qui, conjointement au MSDN, m'a permis de comprendre deux-trois trucs sur l'API CreateFile_().

Néanmoins, au risque d'insister, dans mon code originel, je ne fais pas appel à cette API. J'y ai eu recours (=insérer dans mon code) que pour essayer de comprendre pourquoi l'instruction RenameFile() plante et c'est grâce à elle (même si au final elle est presque inutile) et surtout à GetLastError() que j'ai découvert que c'ést en raison de violations de partage. Comme je l'ai écrit, je ne suis pas un grand connaisseur des APIs et si je peux m'en passer, c'est tant mieux :D . Les utiliser n'est pas un réflexe systématique !

A l'origine, comme je voulais me faire la main sur la programmation avec des threads, je suis parti d'un utilitaire que j'avais développé il y a longtemps et qui fonctionnait correctement jusque-là. Je peux me tromper mais je pense que j'ai peut-être merdé qq part au niveau des threads même si, pour le moment, je n'ai fichtrement aucune idée où ! :D
Tout comme Ar-S me l'a suggéré, ma première réaction a été d'allonger le Delay inclus dans la boucle et après le RenameFile(), pour être sur que le processeur termine sa tâche correctement mais ça n'a pas été concluant. Et puis, ça plante dès le premier fichier à traiter donc ça ne me semble pas être lié à ça.

Il me serait difficile de publier le code entier parce que j'ai plein d'appels à des sous-procédures, à des includes et qu'il me faudrait passer bcp de temps à commenter mon code pour rendre son analyse rapide et intelligible.

Je vais quand même jeter un coup d'oeil à ton lien (et à celui de Marc56 aussi :) ).
Merci pour ton aide.
Répondre