Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

di il
5 risposte

Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

Ho scritto questo codice (ma devo ancora scrivere qualcosa per prevedere se un file/directory di destinazione già esista,per muovere più file,ecc.) ma non riesco a capire perchè al momento non riesca ad usare correttamente io.path.combine.

Sia i files che le directory vengono spostate se utilizzo un codice che genera (diciamo così) “manualmente” le path di destinazione (IO.Directory.Move(currentDir, directoryDestinazione & "\" & IO.Path.GetFileName(currentDir)), ma NON se uso path.combine (IO.Directory.Move(currentDir, IO.Path.Combine(directoryDestinazione, currentDir))), che pure genera in uscita la stessa path.

Gli errori che ricevo sono :“il percorso di orgine non può coinciodere con quello di destinazione” oppure “non si può creare un file se il file esiste già”. 

Dove sbaglio? Grazie per qualsiasi vostro aiuto.


    Private Sub SpostaDirectoryfile_Click(sender As Object, e As EventArgs) Handles SpostaDirectoryfile.Click
        Dim directoryDestinazione As String
        FolderBrowserDialog1.Description = "Selezionare la posizione in cui spostare la directory/file " & currentDir
        FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer
        FolderBrowserDialog1.SelectedPath = currentDir
        If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            directoryDestinazione = FolderBrowserDialog1.SelectedPath
            Dim risposta As DialogResult = MessageBox.Show(Me, "Confermi di voler spostare " & currentDir & " nella nuova posizione " & directoryDestinazione & "?", "Avviso", MessageBoxButtons.YesNo)
            If risposta = DialogResult.Yes Then
                Try
                    If My.Computer.FileSystem.GetDirectoryInfo(currentDir).Attributes = 32 Then
                        IO.File.Move(currentDir, directoryDestinazione & "\" & IO.Path.GetFileName(currentDir))
                        MsgBox("Il file è stato spostato.")
                    ElseIf My.Computer.FileSystem.GetDirectoryInfo(currentDir).Attributes = 16 Then
                        IO.Directory.Move(currentDir, directoryDestinazione & "\" & IO.Path.GetFileName(currentDir))

                        'Dim testPath As String = IO.Path.Combine(directoryDestinazione, IO.Path.GetFileName(currentDir))
                        'IO.Directory.Move(currentDir, IO.Path.Combine(directoryDestinazione, currentDir))

                        MsgBox("La directory è stata spostata.")
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message)
                    Exit Sub
                End Try
            End If
        End If
        currentDir = IO.Path.GetDirectoryName(currentDir)
        aggiorna(currentDir)
    End Sub

5 Risposte

  • Re: Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

    Senza analizzare interamente il codice che hai scritto, sul quale basterebbe fare debugging ed eseguirlo passo passo per vedere quali valori vengono generati per i percorsi interessati e quindi dove si trova l'errore, mi limito a dire che questa riga non può essere corretta:

    IO.File.Move(currentDir, directoryDestinazione & "\" & IO.Path.GetFileName(currentDir))

    Il motivo è semplice: supponendo che in currentDir finisca un percorso di directory, come fai a usare la chiamata a File.Move() che si aspetta un percorso di file usando invece come primo parametro - ovvero come percorso del file da spostare - un percorso di directory?

    Qui il problema non è nel Path.Combine() o meno, ma nella logica generale della procedura che hai codificato, che contiene evidentemente delle parti in errore.

    Usa il debug passo per passo per capire quali sono i valori generati dai metodi utilizzati e qual è il percorso seguito dal codice: le risposte verranno da sé.

    Ciao!

  • Re: Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

    CurrentDir -nel caso da te indicato- indica il percorso completo del fine. Ad esempio, c:\pippo\pluto.txt.

    Grazie mille,Alka.

    Comunque, ho effettuato più volte il debug passo per passo e non ho rilevato (purtroppo!!!!) alcun errore.

    La riga testPath -ad esempio- mi restituisce esattamente la stringa che path.combine si aspetta.

    So che c'è un errore, ma non lo trovo!

  • Re: Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

    28/11/2022 - Jan ha scritto:


    CurrentDir -nel caso da te indicato- indica il percorso completo del fine. Ad esempio, c:\pippo\pluto.txt.

    Se è così, allora perché usi un percorso di file in una istruzione dove invece è richiesto il percorso di una directory, come nello spezzone qui di seguito?

    FolderBrowserDialog1.SelectedPath = currentDir

    28/11/2022 - Jan ha scritto:


    Comunque, ho effettuato più volte il debug passo per passo e non ho rilevato (purtroppo!!!!) alcun errore.

    Capirai anche tu che sono piuttosto basse le probabilità che tu abbia eseguito il programma passo per passo, che tu abbia verificato il valore dei percorsi che ottieni, che tu abbia verificato siano tutti validi, ma nonostante ciò il programma si continua a comportare diversamente da come appare: delle due l'una, o hai sbagliato a fare il debug, o hai sbagliato a verificare i risultati.

    Ad ogni modo, su come hai proceduto o sui valori che hai ottenuto, ricostruendo un percorso di esempio, non hai fornito alcuna indicazione, quindi - al netto di dirti che il debug funziona e che l'esecuzione corrisponde per forza al risultato - non è possibile dirti dov'è che hai sbagliato.

    28/11/2022 - Jan ha scritto:


    La riga testPath -ad esempio- mi restituisce esattamente la stringa che path.combine si aspetta.

    Nel codice che hai inizialmente riportato, quella riga è commentata, quindi non viene eseguita e non può restituire alcunché.

    28/11/2022 - Jan ha scritto:


    So che c'è un errore, ma non lo trovo!

    Ripeto: se esegui il programma passo per passo, l'errore spunterà fuori prima o poi. Quando ciò accadrà, analizza il contenuto delle variabili e verifica quale di queste contiene un valore diverso da quello atteso, metti dei “breakpoint” prima per fermare l'esecuzione anticipatamente al momento in cui quel valore viene determinato, controlla che esso sia corretto.

    E' matematicamente impossibile che tu riesca a eseguire il programma, ottenere l'errore ma non vedere dov'è l'errore: l'errore è localizzato nel punto in cui esso si verifica… se si verifica, è lì, se non si verifica, allora il programma è corretto. :D

  • Re: Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

    Alka, anzitutto un grosso grazie per aver dato ancora la tua attenzione al mio codice.

    Per dovere rispondo ai tuoi quesiti : 

    -FolderBrowserDialog1.SelectedPath = currentDir : hai ragione a dire che folderbrowserdialog si attende una directory ed io gli posso invece currentDir,che invece contiene un percorso completo del file ( c:\pippo\pluto.txt). L'errore non consente a FolderBrowserdialog di evidenziare la directory,ma non altera il funzionamentodel programma.Comunque, rimedio subito;

    -Capirai anche tu che sono piuttosto basse le probabilità che tu abbia eseguito il programma passo per passo…omissis : scusa l'ignoranza, ma eseguire il programma passo per passo tu intendi procedere con il tasto F11? Questo l'ho fatto,ma -come detto- per ignoranza non riesco a trovare un errore. Comunque,ripeterò l'esame fin tanto che non ci sbatterò la testa!;

    -Nel codice che hai inizialmente riportato, quella riga è commentata, quindi non viene eseguita e non può restituire alcunché: restituisce un valore quanto tolgo il commento ed eseguo la verifica passo per passo.

    -"E' matematicamente impossibile che tu riesca a eseguire il programma, ottenere l'errore ma non vedere dov'è l'errore: l'errore è localizzato nel punto in cui esso si verifica… se si verifica, è lì, se non si verifica, allora il programma è corretto":  il programma -salvo che i miei 76 anni non mi pesino oltremodo- funziona correttamente e non restituisce errori . NON funziona (e restituisce l'errore  di cui al post principale) se attivo la riga ‘IO.Directory.Move(currentDir, IO.Path.Combine(directoryDestinazione, currentDir)) in sostitutzione di IO.Directory.Move(currentDir, directoryDestinazione & "\" & IO.Path.GetFileName(currentDir)).

    Buona serata,Alka.E grazie ancora.  

  • Re: Problemi con IO.DIRECTORY.MOVE E IO.PATH.COMBINE

    RISOLTO.

    Era una grossolana svista :

    la riga commentata (che usavo nel debug) era diversa dalla riga che mandavo in esecuzione!

                           'Dim testPath As String = IO.Path.Combine(directoryDestinazione, IO.Path.GetFileName(currentDir))
                           IO.Directory.Move(currentDir, IO.Path.Combine(directoryDestinazione, currentDir)).

    Scusare il disturbo.

Devi accedere o registrarti per scrivere nel forum
5 risposte