Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Erreur avec un FSO.CopyFolder limitation dans les longueurs de chemins ?

24 réponses
Avatar
HD
Bonjour,

Pour copier l'ensemble d'un répertoire j'utilise la méthode avec
FileSystemObject

Cela a bien fonctionné... sauf que.... dernièrement, les utilisateurs de ma
macro m'ont montré que je n'ai plus l'ensemble du répertoire de copier mais
seulement une partie de celui ci !!!

--------------
Dim RepDest As String 'Rép.de destination
Dim RepSource As String 'Rép.Matrice à copier
Dim FSO

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFolder RepSource, RepDest
--------------

Le problème semble lié à seulement certains répertoires de destination... et
cela semble bien lié à la longueur du chemin complet.

Exemple, avec un RepDest = "H:\CAC\1.ASSOCIATIONS\Autres\test" il n'y a pas
de souci... mais avec un RepDest = "H:\CAC\1.ASSOCIATIONS\SECT SOCIAL
INSERTION ACTIVITE ECO\test" j'ai alors un code erreur 76 avec une
description "Chemin d'accès introuvable" sur la ligne:
FSO.CopyFolder RepSource, RepDest

Le dernier fichier copier de la source à la destination est
"H:\CAC\1.ASSOCIATIONS\SECT SOCIAL INSERTION ACTIVITE ECO\test\10 DTA\17
Dossier de contrôle CAC\17.10 Communication avec le client\17.10.2
Echantillonnage de la population à tester pour les
circularisation\Echantillonage de la pop à tester circu frs.xls" (chemin de
253 caractères). Le dernier fichier qui aurait dû être copier mais qui ne
l'a pas été est "H:\CAC\1.ASSOCIATIONS\SECT SOCIAL INSERTION ACTIVITE
ECO\test\10 DTA\17 Dossier de contrôle CAC\17.10 Communication avec le
client\17.10.2 Echantillonnage de la population à tester pour les
circularisation\Matrice échantillonage de la pop à tester circu client.xls"
(chemin de 264 caractères).

Y'a-t-il donc une limitation dans les longueurs de chemin dû à FSO ? dû au
type de donnée String ? Et comment y remédier (sans pour autant limiter la
longueur de ces chemins) ?

Pour précision, je suis sous Windows XP Pro avec un Excel 2007.

Merci d'avance pour votre aide
--
@+
HD

10 réponses

1 2 3
Avatar
michdenis
Je ne l'ai jamais testé... mais ça devrait !
De toute façon, il m'est impossible d'en effectuer le test.

--
MichD
--------------------------------------------


"HD" a écrit dans le message de groupe de discussion : i5j4lk$45k$
Dernière question... Cette API Windows fonctionne-t-elle avec les
différentes versions de Windows ?
(je parle surtout pour XP, 2000, 2003, Vista, Windows 7)

--
@+
HD
Avatar
HD
Je ne l'ai jamais testé... mais ça devrait !
De toute façon, il m'est impossible d'en effectuer le test.


Ok, je vais voir pour tester cela et vous donnerais un retour d'info.

--
@+
HD
Avatar
blaise cacramp
Bonjour,

Normalement la limite est de 254 caractères. Serait-ce 253 ? Ou bien
est-ce un lecteur réseau ?
Évitez les caractères accentués, les points... remplacez-les par des _ ou -
Réduisez les noms au maximum
Essayez aussi xcopy ou son interface graphique WinXcopy
http://winxcopy.cambier.eu/winxcopy.html

Cdt, Blaise

"HD" a écrit dans le message de news:
i5ir4n$2olg$
Bonjour,

Pour copier l'ensemble d'un répertoire j'utilise la méthode avec
FileSystemObject

Cela a bien fonctionné... sauf que.... dernièrement, les utilisateurs de
ma macro m'ont montré que je n'ai plus l'ensemble du répertoire de copier
mais seulement une partie de celui ci !!!

--------------
Dim RepDest As String 'Rép.de destination
Dim RepSource As String 'Rép.Matrice à copier
Dim FSO

Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFolder RepSource, RepDest
--------------

Le problème semble lié à seulement certains répertoires de destination...
et cela semble bien lié à la longueur du chemin complet.

Exemple, avec un RepDest = "H:CAC1.ASSOCIATIONSAutrestest" il n'y a
pas de souci... mais avec un RepDest = "H:CAC1.ASSOCIATIONSSECT SOCIAL
INSERTION ACTIVITE ECOtest" j'ai alors un code erreur 76 avec une
description "Chemin d'accès introuvable" sur la ligne:
FSO.CopyFolder RepSource, RepDest

Le dernier fichier copier de la source à la destination est
"H:CAC1.ASSOCIATIONSSECT SOCIAL INSERTION ACTIVITE ECOtest10 DTA17
Dossier de contrôle CAC17.10 Communication avec le client17.10.2
Echantillonnage de la population à tester pour les
circularisationEchantillonage de la pop à tester circu frs.xls" (chemin
de 253 caractères). Le dernier fichier qui aurait dû être copier mais qui
ne l'a pas été est "H:CAC1.ASSOCIATIONSSECT SOCIAL INSERTION ACTIVITE
ECOtest10 DTA17 Dossier de contrôle CAC17.10 Communication avec le
client17.10.2 Echantillonnage de la population à tester pour les
circularisationMatrice échantillonage de la pop à tester circu
client.xls" (chemin de 264 caractères).

Y'a-t-il donc une limitation dans les longueurs de chemin dû à FSO ? dû au
type de donnée String ? Et comment y remédier (sans pour autant limiter la
longueur de ces chemins) ?

Pour précision, je suis sous Windows XP Pro avec un Excel 2007.

Merci d'avance pour votre aide
--
@+
HD

Avatar
blaise cacramp
Oui cela fonctionnera : compatibilité oblige. Mais si j'ai bon souvenir,
c'est justement l'API qui limite la taille à 254 caractères.

Blaise

"HD" a écrit dans le message de news:
i5j4lk$45k$
Dernière question... Cette API Windows fonctionne-t-elle avec les
différentes versions de Windows ?
(je parle surtout pour XP, 2000, 2003, Vista, Windows 7)

--
@+
HD

Avatar
HD
Dernière question... Cette API Windows fonctionne-t-elle avec les
différentes versions de Windows ?
(je parle surtout pour XP, 2000, 2003, Vista, Windows 7)


Oui cela fonctionnera : compatibilité oblige. Mais si j'ai bon souvenir,
c'est justement l'API qui limite la taille à 254 caractères.



Pourtant j'ai bien des chemins de répertoires dépassant les 254 caractères
qui passent maintenant grâce au script de MichDenis qui utilise cette API.
Je pense que c'est cette API qui est indirectement utilisé par les glisser
ou copier/coller réaliser dans l'interface Windows (via la souris ou le
clavier sur l'explorateur).

--
@+
HD
Avatar
HD
Je viens de me rendre compte d'un pb... Lorsque le répertoire Source ne
contient pas de chemin dépassant les 256 caractères, il est bien
intégralement copier sur le répertoire Destination... par contre, si le
répertoire Source comporte un fichier avec un chemin dépassant les 256
caractères alors le fichier est bien copié mais... il est copié avec son nom
court... il n'apparait donc plus avec le nom "normal" qui lui avait été
donné...

--
@+
HD
Avatar
michdenis
L'API de Windows dans l'exemple précédent supporte des
chemins allant jusqu'à 260 caractères

Voici une autre approche; Elle copie fichier par fichier.
Il faut donc l'insérer dans un boucle sur un répertoire donné
La procédure Exemple te montre comment faire !
Seulement ceci serait suffisant : CopyFile Source, Dest

'------------------------------------
'Déclaration de L'API dans le haut d'un module Standard
Private Declare Function CopyFileW Lib _
"kernel32" (ByVal lpExistingFileName As Long, _
ByVal lpNewFileName As Long, _
ByVal bFailIfExists As Long) As Long
'------------------------------------
Public Function CopyFile(ByVal Source As String, _
ByVal Dest As String) As Boolean
Source = "?" & Source
Dest = "?" & Dest
CopyFile = (CopyFileW(StrPtr(Source), StrPtr(Dest), False) <> 0)
End Function
'------------------------------------
Sub Exemple()
Dim Source As String
Dim Dest As String
Source = "C:pour la premièreFichierCSV_Test.csv"
Dest = "C:test1FichierCSV_Test.csv"
If CopyFile(Source, Dest) = True Then
Call MsgBox("Copie réalisée.")
End If
End Sub
'------------------------------------

--
MichD
--------------------------------------------


"HD" a écrit dans le message de groupe de discussion : i5l97t$30h6$
Je viens de me rendre compte d'un pb... Lorsque le répertoire Source ne
contient pas de chemin dépassant les 256 caractères, il est bien
intégralement copier sur le répertoire Destination... par contre, si le
répertoire Source comporte un fichier avec un chemin dépassant les 256
caractères alors le fichier est bien copié mais... il est copié avec son nom
court... il n'apparait donc plus avec le nom "normal" qui lui avait été
donné...

--
@+
HD
Avatar
JièL
Salut

si je peux me permettre... pourquoi ne pas faire un subst ou un
"raccourci" réseau (net use ?) plus "court" ? La vous jouez avec les
limites et forcément vous allez vous em***.

--
JièL / Jean-Louis GOUBERT
La FAQ Outlook est là : http://faq-outlook.fr/

Le 01/09/2010 12:17, HD a écrit :
Je viens de me rendre compte d'un pb... Lorsque le répertoire Source ne
contient pas de chemin dépassant les 256 caractères, il est bien
intégralement copier sur le répertoire Destination... par contre, si le
répertoire Source comporte un fichier avec un chemin dépassant les 256
caractères alors le fichier est bien copié mais... il est copié avec son nom
court... il n'apparait donc plus avec le nom "normal" qui lui avait été
donné...

Avatar
michdenis
| La vous jouez avec les limites et forcément vous allez vous em***.

La dernière proposition faite est bonne jusqu'à 32768 caractères concernant
les chemins des fichiers à copier et leur destination. Je laisse le soin à d'autres
le soin de tester.

Au delà de ça, c'est carrément de l'extravagance !
;-)

--
MichD
--------------------------------------------


"JièL" a écrit dans le message de groupe de discussion :
4c7e6101$0$5827$
Salut

si je peux me permettre... pourquoi ne pas faire un subst ou un
"raccourci" réseau (net use ?) plus "court" ? La vous jouez avec les
limites et forcément vous allez vous em***.

--
JièL / Jean-Louis GOUBERT
La FAQ Outlook est là : http://faq-outlook.fr/

Le 01/09/2010 12:17, HD a écrit :
Je viens de me rendre compte d'un pb... Lorsque le répertoire Source ne
contient pas de chemin dépassant les 256 caractères, il est bien
intégralement copier sur le répertoire Destination... par contre, si le
répertoire Source comporte un fichier avec un chemin dépassant les 256
caractères alors le fichier est bien copié mais... il est copié avec son nom
court... il n'apparait donc plus avec le nom "normal" qui lui avait été
donné...

Avatar
michdenis
Un détail supplémentaire, lorsque tu fais ta copie, tu pourrais si le besoin est là, modifier le nom du fichier de
destination. Voici la procédure exemple modifiée :

'----------------------------------
Sub Exemple()
Dim Source As String
Dim Dest As String
Source = "C:pour la premièreFichierCSV_Test.csv"
Dest = "C:test1toto.csv"
If CopyFile(Source, Dest) = True Then
Call MsgBox("Copie réalisée.")
End If
End Sub
'----------------------------------

--
MichD
--------------------------------------------


"michdenis" a écrit dans le message de groupe de discussion : i5lm7d$vst$
L'API de Windows dans l'exemple précédent supporte des
chemins allant jusqu'à 260 caractères

Voici une autre approche; Elle copie fichier par fichier.
Il faut donc l'insérer dans un boucle sur un répertoire donné
La procédure Exemple te montre comment faire !
Seulement ceci serait suffisant : CopyFile Source, Dest

'------------------------------------
'Déclaration de L'API dans le haut d'un module Standard
Private Declare Function CopyFileW Lib _
"kernel32" (ByVal lpExistingFileName As Long, _
ByVal lpNewFileName As Long, _
ByVal bFailIfExists As Long) As Long
'------------------------------------
Public Function CopyFile(ByVal Source As String, _
ByVal Dest As String) As Boolean
Source = "?" & Source
Dest = "?" & Dest
CopyFile = (CopyFileW(StrPtr(Source), StrPtr(Dest), False) <> 0)
End Function
'------------------------------------
Sub Exemple()
Dim Source As String
Dim Dest As String
Source = "C:pour la premièreFichierCSV_Test.csv"
Dest = "C:test1FichierCSV_Test.csv"
If CopyFile(Source, Dest) = True Then
Call MsgBox("Copie réalisée.")
End If
End Sub
'------------------------------------

--
MichD
--------------------------------------------


"HD" a écrit dans le message de groupe de discussion : i5l97t$30h6$
Je viens de me rendre compte d'un pb... Lorsque le répertoire Source ne
contient pas de chemin dépassant les 256 caractères, il est bien
intégralement copier sur le répertoire Destination... par contre, si le
répertoire Source comporte un fichier avec un chemin dépassant les 256
caractères alors le fichier est bien copié mais... il est copié avec son nom
court... il n'apparait donc plus avec le nom "normal" qui lui avait été
donné...

--
@+
HD
1 2 3