VB.NET : Problème de copie : chemin d'accès trop long

Fermé
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 - 17 juil. 2016 à 14:14
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 23 juil. 2016 à 21:27
Bonjour,

J'ai créé un programme de sauvegarde qui copie des fichiers sources vers des dossiers de destination.
Le programme fonctionne correctement sauf lorsque le chemin d'accès de la source ou de la destination est trop long : le fichier n'est alors pas copié et une erreur est levée.
Cette erreur n'interrompt pas la sauvegarde, qui continue de copier les fichiers sources suivants, mais des fichiers ne sont alors pas sauvegardés, ce qui peut engendrer des pertes de données.

Une solution serait bien sûr de réduire le nombre de sous-dossiers ou de leur attribuer des noms plus courts, mais c'est contraignant et je ne peux de surcroît pas obliger les utilisateurs de mon programme à le faire.

J'aimerais donc savoir comment, en VB.NET, effectuer quand même la copie des fichiers au chemin d'accès trop long.
Je précise que j'utilise actuellement la méthode
FileStream.CopyToAsync
. Faudrait-il que j'utilise une méthode/bibliothèque spéciale dans le cas où le chemin d'accès est trop long ?

Merci de votre aide.

4 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié par cs_Le Pivert le 17/07/2016 à 14:38
Bonjour,

Essaie ceci:

 Public Sub CopyFile(ByVal sourceFileName As String, ByVal destinationFileName As String)
        My.Computer.FileSystem.CopyFile(sourceFileName, destinationFileName, FileIO.UIOption.AllDialogs)
    End Sub


Pour plus de détail voir ici:

https://codes-sources.commentcamarche.net/source/view/101479/1414833

@+ Le Pivert
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
18 juil. 2016 à 13:55
Bonjour,

Cela ne fonctionne pas.

Voici mon code :
Public Async Sub CopyFile(ByVal sourceFileName As String, ByVal destinationFileName As String)
   Try
       Using SourceStream As FileStream = File.Open(sourceFileName, FileMode.Open)
          Using DestinationStream As FileStream = File.Create(destinationFileName)
             Await SourceStream.CopyToAsync(DestinationStream)
           End Using
        End Using
   Catch ex As Exception
      log.add("échec de la copie 1 : " & ex.Message) 'log est une liste de string que j'utilise pour voir les messages d'erreur
      Try
         My.Computer.FileSystem.CopyFile(sourceFileName, destinationFileName, FileIO.UIOption.AllDialogs)
      Catch ex1 As Exception
         log.add("échec de la copie 2 : " & ex1.Message)
      End Try
   End Try
End Sub


La liste "log" m'indique bien que les deux tentatives de copie échouent avec le même message d'erreur. Cependant, la deuxième tentative n'affiche aucune fenêtre de copie, contrairement à ce que l'argument "
FileIO.UIOption.AllDialogs
" est supposé faire. C'est à croire que la copie échoue avant que la fenêtre ait eu le temps de s'afficher.

Merci de votre aide.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
18 juil. 2016 à 15:07
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
18 juil. 2016 à 15:54
Bonjour,

Je suis au courant que la longueur limite pour un chemin d'accès est de 260 caractères. Ce n'est pas ce que je veux savoir.
Puisque Windows permet visiblement de stocker des fichiers dont la longueur du chemin d'accès dépasse la limite théorique, je pensais que l'on pouvait aussi outrepasser cette limitation en VB.NET.

Merci de votre aide.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
18 juil. 2016 à 16:14
As-tu essayé de copier les fichiers à problème avec une autre application en VB.Net?
C'est peut-être la conception de ton application qui est en cause!

A voir

@+
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
19 juil. 2016 à 13:07
Bonjour,

Je réponds à la fois au message de Whismeril et à celui de cs_Le Pivert.
J'ai créé une autre application, toute simple, composée seulement de deux zones de texte et de trois boutons (un pour chacune des trois fonctions proposées). Je tente de copier un des fichiers qui a causé problème à mon application de sauvegarde, et mon programme "test" retourne le même message d'erreur que précédemment, quelle que soit la fonction utilisée.
Je ne pense donc pas que ce soit la conception de mon application qui soit en cause (ce qui aurait été possible).

Merci de votre aide.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
18 juil. 2016 à 14:17
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
18 juil. 2016 à 15:51
Je ne peux pas tester pour le moment (je le fais dès que possible), mais étant donné que l'exception PathTooLongException fait partie de la liste des exceptions que la fonction peut soulever (à l'instar des fonctions précédentes), cela a peu de (voire aucune) chances de fonctionner.
Il est inutile de me proposer toutes les fonctions de copie qui existent dans le but qu'une d'entre elles fonctionne.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
21 juil. 2016 à 22:42
Bonsoir

as tu pu determiner ce qui est trop long, le nombre de caractères, de sous-répertoire?
Est ce que comme tu le suggères dans ce message tes chemins font plus de 260 caractères?
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
22 juil. 2016 à 12:49
Bonjour,

as tu pu determiner ce qui est trop long, le nombre de caractères, de sous-répertoire? 

Je dirais les deux... Il y a beaucoup de sous-répertoires, dont le nom de chacun - ainsi que celui du fichier - est assez long.
Le chemin source a une longueur "autorisée" (244 caractères (je prends l'exemple d'un des fichiers qui ne veulent pas se copier)) mais le chemin de destination est trop long (277 caractères).
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
21 juil. 2016 à 22:59
Ici
https://stackoverflow.com/questions/8745215/best-way-to-resolve-file-path-too-long-exception

Une réponse propose la librairie Zeta Long Path.

Ça doit être plus simple que la réponse la mieux notée qui consiste à attribuer une lettre de lecteur à une partie du chemin, en commande dos, pour en réduire la taille.
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
Modifié par Anonyme209 le 22/07/2016 à 14:38
Cette librairie semble intéressante, cependant, je n'ai trouvé que des fonctions qui permettent d'accéder aux informations sur les fichiers (notamment la taille du fichier), mais aucune qui permette d'effectuer la copie.

Si tu connais cette librairie, pourrais-tu m'expliquer comment l'utiliser pour copier les fichiers ?

Merci de votre aide.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931 > Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020
22 juil. 2016 à 17:28
Non je ne la connais pas.
Et je ne l'ai pas essayée.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
23 juil. 2016 à 21:27
Bonsoir,

je viens d'y regarder, j'ai trouvé
ZlpIOHelper.CopyFile()
0