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

VBS: différence entre XP et 2000 et nom de fichier trop long

9 réponses
Avatar
robin.manal
Bonjour,

je fait un petit script de sauvegarde de donn=E9e et je bute sur deux
probl=E8mes:
1/ Le premier est une diff=E9rence de comportement entre 2000 et XP.
Effectivement lorsque j'ex=E9cute le code suivant:
Set fso =3D Wscript.CreateObject("Scripting.FileSystemObject")
Set Folder =3D fso.GetFolder("H:")
Nombre =3D Folder.Size
cela fonctionne sous 2000 mais plante sous XP avec un message d'acc=E8s
interdit.
Pouvez-vous m'aider?

2/ Mon deuxi=E8me probl=E8me est que je copie des fichiers en les listant
depuis le r=E9pertoire racine, par exemple en simplifiant fortement:
File =3D "C:\toto\tata"
fso.CopyFile File, "D:\xxxx", True
Cependant lorsque la taille de File d=E9passe 255 caract=E8res, cela
plante.
Avez-vous une solution pour contourner cette limitation?

Merci
Rmanal

9 réponses

Avatar
moi
Bonjour,

je fait un petit script de sauvegarde de donnée et je bute sur deux
problèmes:
1/ Le premier est une différence de comportement entre 2000 et XP.
Effectivement lorsque j'exécute le code suivant:
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set Folder = fso.GetFolder("H:")
Nombre = Folder.Size
cela fonctionne sous 2000 mais plante sous XP avec un message
d'accès
interdit.


pourquoi utiliser un objet folder si le but est de connaitre la taille
d'un lecteur ???

'
========================================================================== Function ESPACEDISQUE(Lecteur)
' Retournent les tailles en Mo
' arrondies avec un chiffre après la virgule
' En cas de quotas, l'espace libre diffère de l'espace disponible
...
' Le retour est un tableau (EspaceTotal, espaceLibre,
EspaceDisponible)
' En cas d'erreur générale : (-2,0,0)
' en cas d'erreur localisée sur une valeur, elle vaut -1
'
========================================================================== On Error Resume Next
Dim fso, drv
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive(fso.GetDriveName(Lecteur))
If Err Then
ESPACEDISQUE=Array(-2,0,0)
Err.clear
Else
DISPO = FormatNumber(drv.AvailableSpace / (1024*1024), 1)
If Err Then
DISPO=-1
Err.clear
End If
LIBRE = FormatNumber(drv.FreeSpace / (1024*1024), 1)
If Err Then
LIBRE=-1
Err.clear
End If
TOTAL = FormatNumber(drv.TotalSize / (1024*1024), 1)
If Err Then
TOTAL=-1
Err.clear
End If
ESPACEDISQUE = Array(TOTAL,LIBRE,DISPO)
End If
Set fso = Nothing
Set drv = Nothing
End Function
'
==========================================================================
A+

HB

Avatar
robin.manal
Merci pour ta réponse mais le but n'est pas de connaitre la taille
d'un lecteur mais d'avoir un traitement générique pour les dossiers,
qui peut être "c:" (cas qui me pose problème), ou "c:totoxxxx" et
autres.
Avatar
moi
Notre ami tapota :

Merci pour ta réponse mais le but n'est pas de connaitre la taille
d'un lecteur mais d'avoir un traitement générique pour les dossiers,
qui peut être "c:" (cas qui me pose problème), ou "c:totoxxxx" et
autres.


Bonsoir,
Dans ce cas ...
Mais pour la racine du lecteur C: il faut poser
Chemin = "C:" et non "C:"
D'ailleurs tu as écrit "C:Totoxxxx" et non "C:Totoxxxx"

' ########################################################
Function TailleRep( Chemin )
' retourne "" en cas d'erreur ou la taille arrondie en Mo
Dim objFSO, objFolder
TailleRep = 0
'
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Chemin)
If( Err.Number <> 0 ) Then
TailleRep = ""
Err.clear
else
TailleRep = FormatNumber( objFolder.Size / ( 1024 * 1024 ),
1 )
End if
Set objFSO = Nothing
set objFolder = Nothing
End Function
' ########################################################

A+

HB

Avatar
robin.manal
J'ai essayé ton script et cela donne le même résultat: une erreur de
script "accès non autorisé" à la ligne TailleRep =
FormatNumber( objFolder.Size / ( 1024 * 1024 ), 1 )
Avatar
Th.A.C

2/ Mon deuxième problème est que je copie des fichiers en les listant
depuis le répertoire racine, par exemple en simplifiant fortement:
File = "C:tototata"
fso.CopyFile File, "D:xxxx", True
Cependant lorsque la taille de File dépasse 255 caractères, cela
plante.
Avez-vous une solution pour contourner cette limitation?

Merci
Rmanal



Le système limite à 255 la taille d'un chemin d'accès à un fichier.
Même si en réalité on y arrive par des moyens détournés, un lien directe
ne peux pas dépasser 255 caractères (250 je crois) en comptant tous les
caractères (':' et '' inclus).

Si par erreur tu arrivais à créer de tels fichiers, tu ne pourrais plus
y accéder directement.

Avatar
Gilles LAURENT
a écrit dans le message de
news:
| Bonjour,

Bonjour,

| je fait un petit script de sauvegarde de donnée et je bute sur deux
| problèmes:
| 1/ Le premier est une différence de comportement entre 2000 et XP.
| Effectivement lorsque j'exécute le code suivant:
| Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
| Set Folder = fso.GetFolder("H:")
| Nombre = Folder.Size
| cela fonctionne sous 2000 mais plante sous XP avec un message d'accès
| interdit.
| Pouvez-vous m'aider?

Ce problème survient toujours sur les dossiers racines NTFS à cause du
dossier spécial "System Volume Information". Une méthode de
contournement consiste à vérifier si le traitement à lieu sur un dossier
racine et le cas échéant obtenir la taille d'une manière différente :

--- Coupez ici ---
Function GetFolderSize (strPath)
Set oFs=CreateObject("Scripting.FileSystemObject")
Set oFolder=oFs.GetFolder(strPath)
If oFolder.IsRootFolder Then
Set oDrive = oFolder.Drive
GetFolderSize = oDrive.TotalSize - oDrive.FreeSpace
Else
GetFolderSize = oFolder.Size
End If
End Function
--- Coupez ici ---

| 2/ Mon deuxième problème est que je copie des fichiers en les listant
| depuis le répertoire racine, par exemple en simplifiant fortement:
| File = "C:tototata"
| fso.CopyFile File, "D:xxxx", True
| Cependant lorsque la taille de File dépasse 255 caractères, cela
| plante.
| Avez-vous une solution pour contourner cette limitation?

Les API Windows supportent des chemins de fichiers d'une longueur
maximale fixée par la constante MAX_PATH soit 260 caractères. Les
chemins sont de la forme suivante :
<drive>:<256 caractères>NULL()

Cependant, les API Unicode, lorsque celles-ci sont disponibles,
permettent de supporter des chemins de fichiers d'une longueur de 32767
caractères (CreateFileW par exemple). Dans ce cas, les chemins sont de
la forme suivante :
?<drive>:<255 caractères><255 caractères>......NULL()

La limitation provient donc des API du Shell Windows. Bien qu'il soit
théoriquement possible de créer des chemins de tailles supérieures à 260
caractères, les différentes API du Shell (PathStripPath par exemple) ne
seront pas en mesure de lire correctement les chemins dépassant la
limite des 260 caractères.

--
Gilles LAURENT
http://glsft.free.fr
Avatar
Michel Claveau
Bonjour !

Je profite d'un Vista de test pour rajouter à ce qui a été dit que si les
fichiers doivent être sauvegardés, il faut tenir compte d'un éventuel
préfixe, lié à l'unité de sauvegarde.

Prévenez donc vos utilisateurs.

De plus, si les fichiers doivent être gravés, attention, le format Joliet
n'accepte que 64 caractères. Il existe des moyens de contournement, mais au
détriment de la compatibilité (risque de ne pas pouvoir relire les
fichiers...)

Et aussi, en gravure, pronfondeur de directories de 8 maxi...

Ah, maintenant, on regrette le temps du 8+3, hein ?

Michel Claveau
Avatar
robin.manal
D'abord merci pour vos contributions à mon problème. Concernant la
taille max, je vais essayer d'éviter d'avoir cette situation.
Concernant le premier point, mon problème est à tiroir, c-a-d en
appelle d'autres:
1/ Lorsque je lance mon script de puis un lecteur et que je passe la
commande fso.GetFolder("même lecteur:"), alors au lieu de me donner le
nom du lecteur, il pointe vers le répertoire du script???

2/ Concernant l'objet sur le répertoire racine, le pb est que je
n'arrive pas à accéder à ses propriétés, comme Files ou .SurFolde rs.
Comment faire pour traiter ce répertoire racine comme un autre
répertoire?
Voici un résumé de mon script qui reproduit ces erreurs (à adapter à
votre conf):
Option explicit

'************************************************************************** *******************************
'* Sous fonctions et procédures
'************************************************************************** *******************************

'************************************************************************** *****************
'* Sous fonction SmartCopy
'*
'* Copie les répertoires et sous-répertoires
'* avec confirmation utilisateur. Ouvre une fenêtre IE (fichier
SmartCopy.htm).
'*
'* IN
'* Source: String sur le dossier source, sans le / à la fin.
'* Destination: String sur le dossier destination, sans le / à la
fin.
'* recursif: Entier permettant de savoir si on a un appel recursif
ou non. Doit
'* valoir 1 lors du premier appel.
'* IE: Objet pointant sur la fenêtre de l'internet exploreur pour la
récursivité.
'* Doit valoir 0 lors du premier appel.
'* Nombre_max: Entier indiquant le nombre max de fichiers à copier.
Utilise pour la récursivité.
'* Doit valoir 0 lors du premier appel.
'* Nombre_traite: Entier indiquant le nombre de fichiers déjà
copiés. Utilie pour la récursivité.
'* Doit valoir 0 lors du premier appel.
'* IN/OUT
'* Liste_des_fichiers_copies: String contenant la liste des fichiers
copies. Elle peut
'* ne pas être vide lors du premier
appel.
'* Liste_des_fichiers_non_copies: String contenant la liste des
fichiers non copiés.
'* Elle peut ne pas être vide lors du
premier appel.
'************************************************************************** *****************
Sub SmartCopy(Source, Destination, _
Liste_des_fichiers_copies,
Liste_des_fichiers_non_copies, recursif, IE, Nombre_max,
Nombre_traite)

'***** Déclarations des variables
Dim SousRep
Dim FicSrc
Dim FicDest
Dim Reponse
Dim Copy_apres_check_date
Dim fso, Chemin
Dim Taille, oDrive

'***** Début du code
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
WshShell.Popup Source & " " & fso.GetFolder(Source).Path


If fso.GetFolder(Source).IsRootFolder Then
Set oDrive = fso.GetFolder(Source).Drive
Taille = oDrive.TotalSize - oDrive.FreeSpace
Else
Taille = fso.GetFolder(Source).Size
End If
Taille = FormatNumber((Taille/(1024*1024)),2)

'***** Calcule le nombre de fichier à copier *******'

Nombre_max = 0
Compte_fichier fso.GetFolder(Source), Nombre_max
Nombre_traite = 0





End Sub


'************************************************************************** *****************
'* Sous fonction Compte_fichiers
'*
'* Compte les fichiers d'un dossier.
'*
'* IN
'* Dossier: Objet pointant sur le dossier dont il doit compter les
fichiers.
'* IN/OUT
'* nombre: Entier indiquant le nombre de fichiers comptés. Doit être
initialisé à 0.
'************************************************************************** *****************
Sub Compte_fichier(Dossier, nombre)

'***** Déclaration des variables
Dim fso

'***** Début du code
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")

Dim SousRep
Dim Fichier

For Each Fichier In Dossier.Files
nombre = nombre + 1
Next

For Each SousRep In fso.GetFolder(Dossier).SubFolders
Compte_fichier SousRep , nombre
Next


End Sub


'************************************************************************** *******************************
'************************************************************************** *******************************
'************************************************************************** *******************************
'* main
'************************************************************************** *******************************
'************************************************************************** *******************************
'************************************************************************** *******************************
Dim WSHShell, fso, WshNet, IE

Set WSHShell = WScript.CreateObject("Wscript.Shell")
Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set WshNet = Wscript.CreateObject("Wscript.Network")
Set IE = WScript.CreateObject("InternetExplorer.Application")

Dim Liste_des_fichiers_copies, Liste_des_fichiers_non_copies
Dim Chemin


'************************************************************************** *****************
'* Début du code
'************************************************************************** *****************



SmartCopy "C:" , "J:Sauvegardes personnellesCopie de E" , _
Liste_des_fichiers_copies,
Liste_des_fichiers_non_copies, 1, 0, 0, 0
Avatar
robin.manal
Personne n'a d'idées?

Autre chose: il y a-t-il un support officiel de Microsoft? Bon
d'accord je rêve;-)