FSO Move Folder sauf un fichier

Signaler
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
-
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
-
Bonjour,
Actuellement le répertoire App.Path de mon application contient le programme .exe mais aussi toutes ses données.
Je voudrais déplacer les données vers Environ$("APPDATA"), ce qui revient à tout déplacer sauf le .exe.
FSO.MoveFolder se plante parce qu'il ne parvient pas à déplacer le .exe qu'il est en train d'exécuter, le nouveau répertoire n'est même pas créé.
FSO.CopyFolder fonctionne très bien mais les fichiers restent évidemment dans App.Path ce qui n'est pas très propre.
Comment faire ?

12 réponses

Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Vous ne nous dîtes pas ce que fait votre application et quelles sont les données qu'elle utilise .
Maintenant aux niveaux des données il peut y avoir des différences . Je vais illustrer mon propos avec le jeu de Scrabble .
Ce jeu a besoin d'un dictionnaire des mots admis . Celui-ci devra être stocké dans App.Path car le projet en a besoin au démarrage .
Maintenant supposons que l'on ne finisse pas la partie et que l'on veut la reprendre plus tard .a la fermeture on va enregistrer dans un fichier tous les paramètres nécessaires pour pouvoir reprendre la partie plus tard comme si on n'avait pas arrêté la partie . Ce fichier sera enregistré sans Environ$(APPDATA) avant de fermer le programme . Le lendemain j'ouvre mon projet . En regardant si dans Environ$(APPDATA) si j'ai un fichier de sauvegarde de ma partie je peux si ce fichier existe reprendre ma partie comme si je ne l'avais pas arrêtée .
Ceci pour illustrer les 2 types de données qu'un programme peut avoir besoin .
Ce n'est pas en déplaçant tes données avec FSO.CopyFolder ou FSO.Movefolder que tu solutionneras ton problème . C'est à l'origine qu'il faut mettre tes données où il faut .
Maintenant sans plus d'information je ne puis t'en dire plus .

Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
Les données sont stockées par le programme, c'est le 2ème type dont tu parles (pour reprendre la partie).
Entretemps j'ai trouvé une partie de la réponse à cette question :
comment déplacer tous les sous-répertoires et fichiers d'un répertoire A vers un répertoire B sauf un fichier bien précis qui est l'exe en train de s'exécuter ?
1) copier tout de A vers B avec FSO.copyfolder
à noter que le .exe est aussi copié inutilement dans B
2) supprimer le ficher .exe de B
3) supprimer tous les fichiers de A sauf le .exe
Dim fso As New FileSystemObject
Dim fil As File
For Each fil In fso.GetFolder(A).Files
If right$(fil.Name,4) <> ".exe" delete A & "/" & fil.Name

4) comment faire pour supprimer les sous-répertoires de A par une méthode similaire à (3) ?
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Ma question revient donc à
comment supprimer tous les répertoires d'un répertoire (mais pas les fichiers) ?
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Si les données sont stockées comme le second type que j'expliquais avec le Scrabble il faut procédé autrement.
1) Au tout début du programme dans le Form_Load de la première forme il faut définir un répertoire de données dans "Environ$(APPDATA) et le créer si celui-ci n'existe pas .
Dim RepertoireData as String = Environ$(APPDATA) & "\XXXXXXX\
if fso.FileExists(RepertoireData) = false then fso.Createfolder(RepertireData) 
ou XXXXXXX représente le nom du sous-répertoire que tu veux donner pour ton projet .
2) Ensuite lorsque ton projet veut créer un fichier de données tu utilises
Dim Fichier as String = RepertoireData & "MesDatas.txt"
par exemple pour un fichier texte .
Si le projet veut accéder à ce même fichier il utilise la même syntaxe pour le nom de fichier .
3) Vu que ton projet est déjà créé il te faut créer le répertoire de données ( voir 1) et placer dedans ensuite avec l'Explorateur de fichiers de Windows tous tes fichiers et répertoires de données . Tu peux ensuite supprimer toujours avec l'Explorateur les fichiers et répertoires des données qui sont dans ton App.Path .
4 )Une fois ceci fait il suffit de modifié les chemins d'accès des fichiers de données dans ton projet VB 6 tout en gardant leurs noms de fichier .

Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Le programme étant installé sur des milliers de PC différents je ne peux pas demander à chaque utilisateur de déplacer les fichiers avec l'explorateur.
Je veux donc déplacer les fichiers automatiquement en VB6.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonjour
Dans ce cas je comprends .
Mais ce que je ne comprends point c'est pourquoi tu veux les déplacer .
Et de plus si au démarrage les fichiers sont déplacés de App.Path vers Environ$("APPDATA") le programme tel qu'il est ira chercher les fichiers dans App.Path et ne les trouvera pas .
A moins que et c'est ma petite idée : tu veux ainsi faire une sauvegarde des fichiers de données .
1) On ouvre le programme
2) On teste si les fichiers de données sont dans App.Path
3) Si oui on fait rien si non on les déplace de Environ$("APPDATA") vers App.Path
4) On utilise le programme normalement
5) A la fermeture du programme on copie les fichiers de données de App.Path vers Environ$("APPDATA") et on les efface de App.Path .

A la prochaine ouverture du programme les fichiers de données étant dans Environ$("APPDATA") le programme les copiera de Environ$(APPDATA) vers App.Path et le programme s'utilise normalement .
Ainsi on utilise les fichiers dans App.Path et on les sauvegarde dans environ$("APPDATA")

Il y aurait même une façon de faire plus logique . C'est d'utiliser une variable qui représente le répertoire avec son chemin complet où se trouvent les fichiers de données .
1) On ouvre le programme .
2) On teste si les fichiers de données sont dans App.Path
3) Si oui on les déplace de App.Path vers Environ$("APPDATA") et le répertoire de données est Environ$("APPDATA")
Dans ce cas il faut modifier tous les chemins des fichiers dans le projet pour que celui-ci soit Environ$("APPDATA") .
Si tu fermes le programme et que tu l'ouvres à nouveau les fichiers étant dans Environ$("APPDATA") le programme s'exécute normalement .

il ne faut jamais mettre les fichiers de données que le programme crée dans le même répertoire de l'exécutable .

Autre chose les utilisateurs ont installé ton programme et leurs données sont dans App.Path . Si tu leur envoies une nouvelle version avec un nouveau Setup ils risquent de perdre leurs fichiers de données . Et là c'est un gros hic !!!!!
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Bonjour,
Ce n'est pas ça.
Actuellement le programme et les données sont dans App.Path.
Je me rends compte que ça pose parfois problème, je voudrais déplacer les données dans AppData lors de la première utilisation d'une nouvelle version du logiciel.
Dans cette nouvelle version, si AppData n'existe pas, donc lors de la toute première exécution, il déplacera les données de App.Path vers AppData; il ira ensuite toujours chercher les données dans AppData.
Pour déplacer les données, je fais successivement
- FSO.CopyFolder App.Path => AppData ce qui copie tout y compris les .exe
- supprimer les fichiers .exe de AppData
- supprimer les fichiers non .exe de App.Path
- supprimer les sous-répertoires de App.Path, je ne savais pas comment faire, entretemps j'ai trouvé.
Voici la solution finalement retenue
G_AppData = Environ$("APPDATA") & "\RVReefTools"
Dim fso As Object
Set fso = CreateObject("scripting.filesystemobject")
If Not fso.FolderExists(G_AppData) Then
' Copy the folder from App.Path to AppData
    fso.CopyFolder Source:=App.Path, Destination:=G_AppData
' Delete all files from AppPath except .exe, delete .exe from DataPath
Dim fso As New FileSystemObject
Dim fil As File
    For Each fil In fso.GetFolder(App.Path).Files
        If Right$(fil.Name, 3) <> ".exe" Then
            DeleteFile (App.Path & "/" & fil.Name)
        Else
            DeleteFile (G_AppData & "/" & fil.Name)
        End If
    Next
' Delete AppPath sub-folders
Dim oFileSys As Scripting.FileSystemObject
Dim oFolder As Scripting.Folder
Dim oSubFolder As Scripting.Folder
Dim fPath As New FileSystemObject
    Set oFileSys = New Scripting.FileSystemObject
    Set oFolder = oFileSys.GetFolder(App.Path)
    For Each oSubFolder In oFolder.SubFolders
        fPath.DeleteFolder (oSubFolder)
    Next oSubFolder
    Set oFolder = Nothing
    Set oFileSys = Nothing
End If
Ce que je n'ai toutefois pas compris dans ces bouts de code récupérés à gauche et à droite c'est la différence entre
Set fso = CreateObject("scripting.filesystemobject")
et
Set oFileSys = New Scripting.FileSystemObject
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Tant mieux si tu as trouvé la solution .
Pour ton problème de différence à mon avis il n'y en a pas . C'est 2 façons de faire pour créer un objet Scripting.FileSystemObject .
Je n'aurais pas pu te proposer du code car il y a belle lurette que j'ai abandonné VB6 pour Visual Studio Net avec VB Net et C#
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Voici mon code final qui fonctionne
Il déplace tout App.Path sauf les .exe vers un répertoire dans AppData
G_AppData = Environ$("APPDATA") & "\RVReefTools"
Dim FSO As New FileSystemObject
Dim FSOfolder As Scripting.Folder
Dim FSOsubfolder As Scripting.Folder
Dim fil As File
Set FSO = New Scripting.FileSystemObject
If Not FSO.FolderExists(G_AppData) Then
' Copy the folder from App.Path to AppData
    FSO.CopyFolder Source:=App.Path, Destination:=G_AppData
' Delete all files from AppPath except .exe, delete .exe from DataPath
    For Each fil In FSO.GetFolder(App.Path).Files
        If Right$(fil.Name, 4) <> ".exe" Then
            DeleteFile (App.Path & "/" & fil.Name)
        Else
            DeleteFile (G_AppData & "/" & fil.Name)
        End If
    Next
' Delete AppPath sub-folders
    Set FSOfolder = FSO.GetFolder(App.Path)
    For Each FSOsubfolder In FSOfolder.SubFolders
        FSO.DeleteFolder (FSOsubfolder)
    Next FSOsubfolder
    Set FSOfolder = Nothing
End If
Si vous avez des remarques sur ce code ...
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
Bonsoir
Loin de moi de pouvoir avoir des remarques sur votre code .
Je n'ai jamais utilisé FSO en VB6 du temps que je programmais en ce langage .Et VB6 c'est très loin pour moi ( ça frôle les 15 ans )
Messages postés
898
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
22 mai 2021
2
Merci de ne pas écrire des réponses interminables pour dire que tu ne peux pas répondre.
Messages postés
2429
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 juin 2021
137
C'est noté merci !