+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

[VS2017 - WIN 7 ULT] - PathTooLongException con percorsi brevi?

  1. #1
    Dev-01 non  in linea Scribacchino
    Post
    540
    Like Inviati  
    2
    Like Ricevuti  
    0
    Buonasera a tutti,

    mi sta capitando un problema che non riesco a risolvere.

    Dispongo di una funzione che mi copia una cartella in un'altra ma ottengo un'eccezione come da oggetto nonostante le lunghezze dei percorsi (su pc locale) siano:

    per la cartella sorgente: 97;
    per il percorso target: 78.

    Questo il codice che utilizzo:

     
        Function CopyDirectory(ByVal SourcePath As String, ByVal TargetPath As String) As String
    
            If Directory.Exists(TargetPath) Then Directory.Delete(TargetPath, True)
            Directory.CreateDirectory(TargetPath)
    
            Dim Files() As String = Directory.GetFiles(Path.GetDirectoryName(SourcePath))
    
            For Each File In Files
                Dim _CurrentFile As String = Path.Combine(TargetPath, Path.GetFileName(File))
                IO.File.Copy(File, _CurrentFile, True)
            Next
    
            Dim Folders() As String = Directory.GetDirectories(Path.GetDirectoryName(SourcePath))
    
            For Each Folder In Folders
                Dim _CurrentPath As String = Path.Combine(TargetPath, Path.GetFileName(Folder))
                If IO.Directory.Exists(_CurrentPath) Then IO.Directory.Delete(_CurrentPath)
                CopyDirectory(Folder, _CurrentPath)
            Next
    
            Return _OperationCompleteMessage
    
        End Function
    
    Questo codice presenta un altro problema (per il quale non apro un altro thread perch secondo me la radice del primo):

    La cartella sorgente viene copiata ad oltranza all'interno della prima cartella presente in destinazione generando un albero molto grande il che probabilmente, ad un certo punto, genera l'errore.
    Ultima modifica di Dev-01; 04-01-2021 19:07 

  2. #2
    L'avatar di AntonioG
    AntonioG non  in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,396
    Blogs
    5
    Like Inviati  
    5
    Like Ricevuti  
    32
    Dovresti mostrare anche la InternalCopyDirectory
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Dev-01 non  in linea Scribacchino
    Post
    540
    Like Inviati  
    2
    Like Ricevuti  
    0
    Scusami Antonio, hai ragione.

    [EDIT] ho provveduto alla modifica del codice. La funzione ricorsiva.
    Ultima modifica di Dev-01; 04-01-2021 19:08 

  4. #4
    L'avatar di _alka_
    _alka_ non  in linea Very Important Person
    Post
    1,357
    Like Inviati  
    0
    Like Ricevuti  
    14
    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    Dispongo di una funzione che mi copia una cartella in un'altra ma ottengo un'eccezione come da oggetto nonostante le lunghezze dei percorsi (su pc locale) siano:

    per la cartella sorgente: 97;
    per il percorso target: 78.
    Hai considerato anche la lunghezza dei nomi di file, oltre a quello delle directory?

    Se non ricordo male, esistono limiti specifici per entrambe le parti del percorso, ossia la lunghezza del percorso della directory e del nome del file, e della loro combinazione.

    Ad ogni modo, credo che individuare la problematica sia abbastanza semplice: nel momento in cui viene sollevata l'eccezione (abilita l'interruzione nelle Exception Settings di Visual Studio) ispeziona il percorso usato nell'operazione di copia.

    Ciao!
    ℹ️ Leggi di pi su _alka_ ...

  5. #5
    Ferrari_and non  in linea Scolaretto
    Post
    295
    Like Inviati  
    2
    Like Ricevuti  
    3
    Ciao,
    non ho mai usato la funzione Directory.GetDirectories ma se funziona come la vecchia funzione del VB6 potrebbe restituirti tutte le sottocartelle presenti in una Directory anche quelle speciali.
    Quindi per principio anche le 2 cartelle speciali . e ..
    Se cosi fosse la prima cartella . che trovi non altro che la cartella in cui sei posizionato.
    Quindi la funzione ricorsiva ricopia perennemente la cartella di partenza.

    Spero di essermi spiegato in modo compensibile (ne dubito)

    Quindi il consiglio testa se la cartelle che vai a copiare non sia la . e la ..

  6. #6
    Dev-01 non  in linea Scribacchino
    Post
    540
    Like Inviati  
    2
    Like Ricevuti  
    0
    Grazie _alka_,

    Nello specifico si trattava di copiare una cartella vuota e due file ognuno con un nome inferiore ai 12 caratteri.

    Mi piacerebbe capire perch Il ciclo viene reiterato ad libitum fino al sollevamento dell'eccezione.

    Ho comunque risolto col metodo My.Computer.FileSystem.CopyDirectory() ma non mi va perch si tratta di un Wrapper delle funzioni Microsoft.VisualBasic.

    Resto in ascolto.

    Grazie.

  7. #7
    L'avatar di AntonioG
    AntonioG non  in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,396
    Blogs
    5
    Like Inviati  
    5
    Like Ricevuti  
    32
    Quel codice non fa altro che creare continuamente la prima cartella, ad esempio, se copi D:\Prova\w1 nella destinazione D:\Prova\w2 non fa altro che continuare a creare cartelle del tipo

    D:\Prova\w2\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1 \w1\w1\w1\w1\w1\w1\w1....

    e cos via fino all'eccezione di path troppo lungo. Evidentemente sbagliata. Prova cos

        Public Sub CopyDirectory(ByVal srcPath As String, ByVal dstPath As String)
            Dim sdi As New DirectoryInfo(srcPath)
    
            If Not Directory.Exists(dstPath) Then Directory.CreateDirectory(dstPath)
    
            Dim fsi As FileSystemInfo
            For Each fsi In sdi.GetFileSystemInfos
                Dim dfn As String = Path.Combine(dstPath, fsi.Name)
    
                If TypeOf fsi Is FileInfo Then
                    File.Copy(fsi.FullName, dfn, True)
                Else
                    CopyDirectory(fsi.FullName, dfn)
                End If
            Next
        End Sub
    
    ℹ️ Leggi di pi su AntonioG ...

  8. #8
    Dev-01 non  in linea Scribacchino
    Post
    540
    Like Inviati  
    2
    Like Ricevuti  
    0
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Quel codice non fa altro che creare continuamente la prima cartella, ad esempio, se copi D:\Prova\w1 nella destinazione D:\Prova\w2 non fa altro che continuare a creare cartelle del tipo

    D:\Prova\w2\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1\w1 \w1\w1\w1\w1\w1\w1\w1....

    e cos via fino all'eccezione di path troppo lungo. Evidentemente sbagliata. Prova cos
    Esatto Antonio, il poblema alla radice proprio quello.

    Ho provato e funziona, ti ringrazio per la collaborazione.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Tutorial GIT per VS2017
    Da SebastianoFloridia nel forum Pausa caff
    Risposte: 1
    Ultimo Post: 01-01-2018, 23:21
  2. Tutorial GIT per VS2017
    Da SebastianoFloridia nel forum C#
    Risposte: 1
    Ultimo Post: 01-01-2018, 23:21
  3. Mandare brevi messaggi sulla rete fra PC
    Da Hollywood nel forum Networking e sicurezza
    Risposte: 5
    Ultimo Post: 09-04-2014, 13:49
  4. Percorsi Relativi e Percorsi Assoluti
    Da blacksheep nel forum PHP
    Risposte: 7
    Ultimo Post: 31-12-2011, 15:07