none
File lunghi più di 255 caratteri RRS feed

  • Domanda

  • Ciao,

    sto cercando di trasferire centinaia di migliaia di file da un Server OSx ad un Server Windows 2012 R2.

    Mi sono accorto però che molti file hanno un percorso troppo lungo e quindi una volta copiati sul Server Windows non riesco più a leggerli ne a modificarli.

    Esiste un metodo, un tools oppure una modalità diversa di configurazione del Disco Windows, per poter utilizzare questi files?

    Grazie

    Franco

    venerdì 8 luglio 2016 12:25

Risposte

  • Purtroppo è come ha detto Andrea e per ovviare al problema potresti:

    1. utilizzare uno script ad hoc (io di solito uso questo + robocopy)
    2. usare utility di terze parti http://www.replsoft.com/cutlongnames.html(utility che non ho mai usato)
    3. usare robocopy per spostare blocchi di directory in percorsi più corti
    4. condividere delle sottocartelle per poter operare sui percorsi, poi rimuovere le condivisioni
    5. usare subst, apri un cmd.exe, con il comando CD posizionati all'interno fino a dove puoi e poi
      subst X: . 

    ciao

    Gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere

    lunedì 11 luglio 2016 01:25
    Moderatore
  • Avevo letto il documento, purtroppo il limite è "HARD CODED" (qualche variabile di tipo BYTE) nel cmd e in powershell  es. con cmd si riesce a fare un percorso max di 255 e con ps si arriva a 260.

    Sicuramente tutto funziona (come da doc), se si chiamano le api giuste nativamente da linguaggi managed  o powershell.

    Confermo che su di un windows 10 ha gestito bene i percorsi lunghi visualizzandoli "short" (un work around...) su altri niente da fare solito errore!

    Allora mi sono detto e se io uso il percorso corto come fa  windows 10?

    Di seguito il solito codice per generare un percorso bello lungo

    ::eseguire da un prompt dei comandi le seguenti 3 linee di codice
    mkdir c:\prova
    echo.>c:\prova\file-da-cancellare.txt
    ::creo un path lungo 247 ([c:\][path][null char]=3+243+1) powershell.exe -command $p=(('x' * 60) +'\')*4; mkdir "c:\$p" ; cd "c:\$p" ; cmd /k

    nel command prompt si incolla il codice seguente per avere il percorso corto

    for /f %A  in ('dir /b') do cd "%~sA"

    Il TAAC di Bruno Bozzetto e funziona!

    Ora da prompt è possibile cancellare/creare/etc

    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1>cd oltre\i\260\caratteri
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri>mkdir dipiuAncoradipiu
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri>cd dipiuAncoradipiu
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri\dipiuAncoradipiu>

    Questo è il 6° modo !!!

    E da powershell funziona il workaround?

    NO

    Windows PowerShell
    Copyright (C) 2015 Microsoft Corporation. Tutti i diritti sono riservati.

    PS C:\temp> "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1".length
    38
    PS C:\temp> cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1"
    PS C:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> cd\
    PS C:\> cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri"
    cd : Impossibile elaborare l'argomento. Il valore dell'argomento "path" non è valido. Modificare
    il valore dell'argomento "path" ed eseguire nuovamente l'operazione.
    In riga:1 car:1
    + cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri"
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Set-Location], PSArgumentException
        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.SetLocationCommand

    Ciao Gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere




    venerdì 15 luglio 2016 20:14
    Moderatore

Tutte le risposte

  • Ciao Franco,

    purtroppo questa è una limitazione delle API di Windows (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396) per risolvere il problema puoi provare ad accorciare i nomi delle cartelle che compongono il path.

    In caso non riuscissi a modificare/cancellare i file tempo fa ho usato questo metodo: http://sistarelli.com/2016/06/04/impossibile-eliminare-un-file-o-una-cartella/

    Ciao


    Andrea Sistarelli
    Blog
    Datacen srl - Consulenza informatica

    venerdì 8 luglio 2016 12:36
  • Purtroppo è come ha detto Andrea e per ovviare al problema potresti:

    1. utilizzare uno script ad hoc (io di solito uso questo + robocopy)
    2. usare utility di terze parti http://www.replsoft.com/cutlongnames.html(utility che non ho mai usato)
    3. usare robocopy per spostare blocchi di directory in percorsi più corti
    4. condividere delle sottocartelle per poter operare sui percorsi, poi rimuovere le condivisioni
    5. usare subst, apri un cmd.exe, con il comando CD posizionati all'interno fino a dove puoi e poi
      subst X: . 

    ciao

    Gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere

    lunedì 11 luglio 2016 01:25
    Moderatore
  • Andrea ho provato ad usare la sinassi posix "\\?\"  come hai suggerito, ma non funziona con percosi più lunghi di 255

    Rimane utile solo per cancellare file o folder con caratteri o nomi particolari es.

    mkdir \\.\c:\temp\con
    rmdir \\.\c:\temp\con
    ciao Gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere




    lunedì 11 luglio 2016 01:37
    Moderatore
  • Ciao Gastone,

    devi usare il ? e non il ., ho provato ora e funziona:

    C:\Temp\prova>dir
     Volume in drive C has no label.
     Volume Serial Number is 762E-432D
    
     Directory of C:\Temp\prova
    
    13/07/2016  08:45    <DIR>          .
    13/07/2016  08:45    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  70.583.152.640 bytes free
    
    C:\Temp\prova>mkdir \\?\c:\temp\prova\test
    
    C:\Temp\prova>dir
     Volume in drive C has no label.
     Volume Serial Number is 762E-432D
    
     Directory of C:\Temp\prova
    
    13/07/2016  08:46    <DIR>          .
    13/07/2016  08:46    <DIR>          ..
    13/07/2016  08:46    <DIR>          test
                   0 File(s)              0 bytes
                   3 Dir(s)  70.583.152.640 bytes free
    
    C:\Temp\prova>
    

    Ciao


    Andrea Sistarelli
    Blog
    Datacen srl - Consulenza informatica

    • Proposto come risposta aperelli mercoledì 13 luglio 2016 08:16
    • Proposta come risposta annullata GastoneCanaliModerator mercoledì 13 luglio 2016 17:56
    mercoledì 13 luglio 2016 06:46
  • Ciao Gastone,

    devi usare il ? e non il ., ho provato ora e funziona:

    ...

    C:\Temp\prova>mkdir \\?\c:\temp\prova\test

    ...

    Ciao


    Andrea Sistarelli
    Blog
    Datacen srl - Consulenza informatica

    Ciao Andrea,

    io non ho mai detto che la sintassi posix (\\?\ o \\.\) non funzioni  con percorsi inferiori ai 260 caratteri!!!

    Avevo detto:

    "Andrea ho provato ad usare la sinassi posix "\\?\"  come hai suggerito, ma non funziona con percosi più lunghi di 255"

    e continua a non funzionare anche con \\?\

    Ecco il test

    ::eseguire da un prompt dei comandi le seguenti 3 linee di codice
    mkdir c:\prova
    echo.>c:\prova\file-da-cancellare.txt
    ::creo un path lungo 247 ([c:\][path][null char]=3+243+1) powershell.exe -command $p=(('x' * 60) +'\')*4; mkdir "c:\$p" ; cd "c:\$p" ; cmd /k

    per superare la barriera dei 260 usiamo robocopy

    nel prompt rimasto aperto digitiamo:

    robocopy c:\prova oltre\i\260\caratteri
    :: ora proviamo ad andare sempre più in fondo cd oltre cd i cd 260

    a questo punto 

    cd \
    del \\?\C:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\oltre\i\260\caratteri\file-da-cancellare.txt Nome del file o estensione troppo lunga.

    ciao



    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere





    mercoledì 13 luglio 2016 23:09
    Moderatore
  • Ciao Gastone,

    scusa non avevo letto bene il tuo post, effettivamente non funziona!!! Eppure sono sicuro di averlo usato su un server 2012 R2 di un cliente e così sembra anche leggendo la pagina (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx)

    Stavo cercando un pò su Google e sembra che nell'ultima Insider Preview di Windows 10 Microsoft ha aggiunto il supporto ai path pià lunghi si 260 caratteri:

    http://www.ghacks.net/2016/05/27/microsoft-260-long-path-limit/

    Ciao


    Andrea Sistarelli
    Blog
    Datacen srl - Consulenza informatica

    giovedì 14 luglio 2016 13:06
  • Avevo letto il documento, purtroppo il limite è "HARD CODED" (qualche variabile di tipo BYTE) nel cmd e in powershell  es. con cmd si riesce a fare un percorso max di 255 e con ps si arriva a 260.

    Sicuramente tutto funziona (come da doc), se si chiamano le api giuste nativamente da linguaggi managed  o powershell.

    Confermo che su di un windows 10 ha gestito bene i percorsi lunghi visualizzandoli "short" (un work around...) su altri niente da fare solito errore!

    Allora mi sono detto e se io uso il percorso corto come fa  windows 10?

    Di seguito il solito codice per generare un percorso bello lungo

    ::eseguire da un prompt dei comandi le seguenti 3 linee di codice
    mkdir c:\prova
    echo.>c:\prova\file-da-cancellare.txt
    ::creo un path lungo 247 ([c:\][path][null char]=3+243+1) powershell.exe -command $p=(('x' * 60) +'\')*4; mkdir "c:\$p" ; cd "c:\$p" ; cmd /k

    nel command prompt si incolla il codice seguente per avere il percorso corto

    for /f %A  in ('dir /b') do cd "%~sA"

    Il TAAC di Bruno Bozzetto e funziona!

    Ora da prompt è possibile cancellare/creare/etc

    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1>cd oltre\i\260\caratteri
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri>mkdir dipiuAncoradipiu
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri>cd dipiuAncoradipiu
    C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri\dipiuAncoradipiu>

    Questo è il 6° modo !!!

    E da powershell funziona il workaround?

    NO

    Windows PowerShell
    Copyright (C) 2015 Microsoft Corporation. Tutti i diritti sono riservati.

    PS C:\temp> "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1".length
    38
    PS C:\temp> cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1"
    PS C:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> cd\
    PS C:\> cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri"
    cd : Impossibile elaborare l'argomento. Il valore dell'argomento "path" non è valido. Modificare
    il valore dell'argomento "path" ed eseguire nuovamente l'operazione.
    In riga:1 car:1
    + cd "C:\XXXXXX~1\XXXXXX~1\XXXXXX~1\XXXXXX~1\oltre\i\260\caratteri"
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Set-Location], PSArgumentException
        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.SetLocationCommand

    Ciao Gas


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere




    venerdì 15 luglio 2016 20:14
    Moderatore
  • il tempo passa e un po' di documentazione ufficiale è uscita

    Ecco come verificare se i percorsi lunghi sono abilitati

    :: queto comando DEVE ritornare
    ::  LongPathsEnabled    REG_DWORD    0x1
    reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" -v long*

    :: questo per verificare se c'è la policy applicata
    reg.exe query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Policies" -v long*

    :: Setta la chiave per abilitare LongPathsEnabled   

    reg.exe ADD HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f


    https://docs.microsoft.com/it-it/windows/win32/fileio/maximum-file-path-limitation

    Enable Long Paths in Windows 10, Version 1607, and Later

    Starting in Windows 10, version 1607, MAX_PATH limitations have been removed from common Win32 file and directory functions. However, you must opt-in to the new behavior.

    To enable the new long path behavior, both of the following conditions must be met:

    • The registry key Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (Type: REG_DWORD) must exist and be set to 1. The key's value will be cached by the system (per process) after the first call to an affected Win32 file or directory function (see below for the list of functions). The registry key will not be reloaded during the lifetime of the process. In order for all apps on the system to recognize the value of the key, a reboot might be required because some processes may have started before the key was set.

      Nota

      This registry key can also be controlled via Group Policy at Computer Configuration > Administrative Templates > System > Filesystem > Enable Win32 long paths.

    • The application manifest must also include the longPathAware element.

      XML
    • 
          <windowssettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
              <ws2:longpathaware>true</ws2:longpathaware>
          </windowssettings>
      
      "><application xmlns="urn:schemas-microsoft-com:asm.v3">
          <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
              <ws2:longPathAware>true</ws2:longPathAware>
          </windowsSettings>
      </application>
      

    These are the directory management functions that no longer have MAX_PATH restrictions if you opt-in to long path behavior: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.


    Gastone Canali >


    Se alcuni post rispondono al tuo quesito, ricorda di contrassegnarli come risposta e non dimenticare anche i post utili. GRAZIE! Dai un occhio ai link Click Here and Here Leaderboard Here


    venerdì 15 gennaio 2021 09:43
    Moderatore