none
Utilisation de "Directory.Move" pour déplacer des dossiers, marche dans un cas mais pas dans un autre RRS feed

  • Question

  • Bonjour ma question est assez simple :

    j'utilise un code pour archiver des dossiers vers plusieurs répertoires différents.

    La méthode consiste à chaque fois de créer le dossier de destination et d'y mettre les fichiers du dossier source

    Cas N°1 aucun soucis tout fonctionne :

        Public Sub Archtransferts() 'Archive Transferts journaliers à faire le lundi de la semaine suivante
            Dim source2 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Transferts vers entrepôt")
            Dim dest2 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Transferts\Semaine " & DatePart("ww", Date.Now(), vbSunday, vbFirstFourDays))
            Dim rslt3 = MsgBox("Confirmer l'archivage des fichiers transferts?", MsgBoxStyle.Question, vbOKCancel)
            If rslt3 = MsgBoxResult.Ok Then
                Try
                    If Directory.Exists(dest2) Then
                        Directory.Delete(dest2)
                    End If
                    Directory.Move(source2, dest2)
                    MsgBox("Archivage effectué à " & TimeOfDay.ToShortTimeString)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            Else
                If MsgBoxResult.Cancel Then
                    Exit Sub
                End If
            End If
        End Sub

    Cas N°2 ca ne fonctionne pas, l'obtient un message d'erreur du chemin d'accès :

       Public Sub ArchRemStk() 'Archive remontée de stocks journaliers à faire le 1er du mois
            Dim source3 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Entrées en stock journalières")
            Dim dest3 As String = ("‪‪‪C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Entrées en stock\" & Date.Now.AddMonths(-1).ToString("MMMM yyyy"))
    
            Dim rslt4 = MsgBox("Confirmer l'archivage des fichiers remontées de stocks?", MsgBoxStyle.Question, vbOKCancel)
            If rslt4 = MsgBoxResult.Ok Then
                Try
                    If Directory.Exists(dest3) Then
                        Directory.Delete(dest3)
                    End If
                    Directory.Move(source3, dest3)
                    MsgBox("Archivage effectué à " & TimeOfDay.ToShortTimeString)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
        End Sub

    J'avoue ne pas bien comprendre en ce sens que le code est identique!


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 10:33

Toutes les réponses

  • Pouvez-vous tester que le dossier source existe?

    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 11:46
  • Je n'ai pas un niveau très élevé donc comment faire pour tester que le dossier existe?

    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 12:27
  • Essayer de mettre ceci dans votre code:

    Public Sub ArchRemStk() 'Archive remontée de stocks journaliers à faire le 1er du mois
            Dim source3 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Entrées en stock journalières")
            Dim dest3 As String = ("‪‪‪C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Entrées en stock\" & Date.Now.AddMonths(-1).ToString("MMMM yyyy"))
    
            Dim rslt4 = MsgBox("Confirmer l'archivage des fichiers remontées de stocks?", MsgBoxStyle.Question, vbOKCancel)
            If rslt4 = MsgBoxResult.Ok Then
                Try
                    if Directory.Exists(source3)=False then
                        MsgBox("Le dossier source n'existe pas.",MsgBoxStyle.Information,vbOK)
                    else
                        'Le dossier existe on peut le copier'
                        If Directory.Exists(dest3) Then
                            Directory.Delete(dest3)
                        End If
                        Directory.Move(source3, dest3)
                        MsgBox("Archivage effectué à " & TimeOfDay.ToShortTimeString)
                    EndIf
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End If
        End Sub
    Et svp si vous avez été aidé, indiquez que c'est la réponse et votez sur les indications données. Merci


    Cyrille Precetti
    Bonne Année! Happy New Year!


    dimanche 10 janvier 2016 12:38
  • Malheureusement j'obtient toujours la même erreur:


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 14:11
  • L'erreur est dans le nom du dossier.

    Pouvez-vous poster le nom entier?

    Faites un :

    Debug.Print("Nom dossier source = " & source3)

    et postez le.

    De manière générale les espaces et accents sont à proscrire dans vos système de fichiers, cela évite des surprises désagréables...


    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 14:21
  • Voici ce que m' donné l'instruction Debug.Print :

    Nom dossier source = C:\Dropbox\Abattoirs des Crêts\Congélation\Entrées en stock journalières


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 15:02
  • et dest3?

    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 15:07
  • le nom est = ‪‪‪C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Entrées en stock\décembre 2015


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 15:13
  • Il y a quelquechose qui cloche dans un des noms de dossier.

    Pouvez-vous aller plus loin dans la trace de l'exception et ajouter ceci:

    'En haut de la classe'

    Imports System.Collections

    Try

    Directory.Move(source3,dest3)

    Catch e As Exception
             Debug.print("An exception was thrown.")
             Debug.print(e.Message)

    If e.Data.Count > 0 Then debug.Print(" Extra details:") For Each de As DictionaryEntry In e.Data debug.Print(" Key: {0,-20} Value: {1}", "'" + de.Key.ToString() + "'", de.Value) Next End If

    End Try

    et poster les détails de l'exception...



    Cyrille Precetti
    Bonne Année! Happy New Year!


    dimanche 10 janvier 2016 15:26
  • voici:

    An exception was thrown.
    Le format du chemin d'accès donné n'est pas pris en charge.


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 15:33
  • J'ai une autre idée.... vous faites un Directory.Delete(dest3), MAIS si la destruction du dossier à travers le réseau est plus ou moins longue il y a peut être encore des éléments dans dest3 ....

    Il faudrait peut être refaire un .Exists à nouveau et attendre que .Exists soit False.....

    Faites

    While Directory.Exists(dest3)=true
    
    Threading.Thread.Sleep(500) 'demie seconde
    end while
    Ce n'est pas très beau mais cela peut prévenir une collision entre Delete et Move...


    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 15:33
  • L'idée est bonne je pense , mais à quel endroit de ma Sub dois-je mettre ce code?

    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 15:37
  • A la place de:

    Directory.Move(dest3)


    mettez:

    while Directory.Exists(dest3)=true
    Threading.Thread.Sleep(500)
    End While
    Directory.Move(dest3)



    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 15:48
  • J'obtient encore la même erreur : An exception was thrown.
    Le format du chemin d'accès donné n'est pas pris en charge.

      Public Sub ArchRemStk() 'Archive remontée de stocks journaliers à faire le 1er du mois
            Dim source3 As String = ("C:\Dropbox\Abattoirs des Crêts\Congélation\Entrées en stock journalières")
            Dim dest3 As String = ("‪‪‪C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Entrées en stock\" & Date.Now.AddMonths(-1).ToString("MMMM yyyy"))
    
            Dim rslt4 = MsgBox("Confirmer l'archivage des fichiers remontées de stocks?", MsgBoxStyle.Question, vbOKCancel)
            If rslt4 = MsgBoxResult.Ok Then
                Try
                    If Directory.Exists(source3) = False Then
                        MsgBox("Le dossier source n'existe pas.", MsgBoxStyle.Information, vbOK)
                    Else
                        'Le dossier existe on peut le copier'
                        If Directory.Exists(dest3) Then
                            Directory.Delete(dest3)
                        End If
                        While Directory.Exists(dest3) = True
                            Threading.Thread.Sleep(500)
                        End While
                        Directory.Move(source3, dest3)
                        MsgBox("Archivage effectué à " & TimeOfDay.ToShortTimeString)
                    End If
                Catch e As Exception
                    Debug.print("An exception was thrown.")
                    Debug.print(e.Message)
                    If e.Data.Count > 0 Then
                        debug.Print("  Extra details:")
                        For Each de As DictionaryEntry In e.Data
                            debug.Print("    Key: {0,-20}      Value: {1}",
                            "'" + de.Key.ToString() + "'", de.Value)
                        Next
                    End If
                End Try
            End If
        End Sub


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 16:03
  • Pouvez vous essayer avec un chemin nettoyé:

    remplacez

    "‪‪‪C:\Dropbox\Abattoirs des Crêts\Congélation\Archives 2016\Archives Entrées en stock\" & Date.Now.AddMonths(-1).ToString("MMMM yyyy"))

    par

    "‪‪‪C:\Dropbox\AbattoirsDesCrets\Congelation\Archives2016\ArchivesEntreesEnStock\Decembre2015"

    Pour voir ce que cela donne.

    Je suggère également de remplacer le nom du mois par une valeur numérique, plus facile à trier...

    D'une manière générale il faut éviter les accents, les blancs dans les noms de fichiers. Vous ne savez pas quel genre de tuyaux sont utilisés par Dropbox et Windows pour accèder à ces fichiers.


    Cyrille Precetti
    Bonne Année! Happy New Year!

    dimanche 10 janvier 2016 16:42
  • Ok merci pour tous ces conseils et le temps passé cet aprem pour traité ce sujet.

    Je teste cela demain et je vous reviens

    bonne soirée


    JF Collombet ® CreateSpecificCulture

    dimanche 10 janvier 2016 17:03
  • Le résultat est toujours le même, "le chemin d'accès spécifié est introuvable"

    Pas grave je vais essayé de faire autrement


    JF Collombet ® CreateSpecificCulture

    lundi 11 janvier 2016 15:27