Come eliminare le directory con path / nomi troppo lunghi per l'eliminazione normale

Windows sembra avere un limite di lunghezza sui nomi di file quando si tenta di eliminare, anche se non impedirà di creare tali file.

Il nostro process di creazione crea un certo numero di file temporanei (molti sono stati creati da un WSDL) che si trovano in esecuzione di questo limite. Il nostro ant script è in qualche modo in grado di eliminarli quando faccio una pulizia, ma a volte ho bisogno di eliminare la directory di workarea (where tutti i file temp passano) senza effettivamente fare una pulizia completa dalla formica.

Questo è lo stesso errore di questa domanda , ma le risposte non funzionano veramente per me, poiché ho a che fare con una directory, non un file, e non so sempre quali file o sottodirectory specifici stanno causando il problema. E sto cercando di evitare qualsiasi process manuale (diverso da quello di triggersre un singolo command) per eliminarli effettivamente.

Se cerco di eliminare la directory da Explorer, ottengo l'errore

Cannot delete [file name]: The file name you specified is not valid or too long. Specify a different file name 

Provare l' Remove-Item di rimozione in powershell dà il seguente errore:

 Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. At line:1 char:12 + Remove-Item <<<< -force -Recurse <directory> 

Qualcuno sa di strumenti o modi semplici per aggirare questo errore di eliminazione senza wherer trovare manualmente i file di problema e spostare / rinominarli?

Scarica 7zip , il suo gestore di file può eliminarli. Inestimabile se usi qualcosa come Cobian Backup, che ha una brutta abitudine di creare routes lunghi …

Dai commenti:

Se hai ancora problemi, assicuratevi di utilizzare shift + del. Questo perché le windows tentano di spostare tali file nel cestino.

Nessuna delle altre (gratis) risposte qui ha funzionato per me, ma ho trovato uno su un altro sito:

 rimraf <dir> 

rimraf è un pacchetto Node.js , quindi sarà necessario installare Node.js che include npm . Poi è ansible eseguire:

 npm install -g rimraf 

Quindi è ansible eseguire rimraf dalla row di command.

Ho trovato questa soluzione perché npm stesso stava causando questo problema a causa del modo in cui nidificano le dependencies.

A proposito, rimraf ottiene il suo nome dal command rm -rf , che elimina file e cartelle in modo ricorsivo.

Non è necessario installare alcun programma per risolvere questo problema.

Questo problema è facilmente risolto utilizzando robocopy , preinstallato da Windows Vista, lanciato nel 2006.

Ad esempio, rmdir /S /Q <dir> è stato segnalato per fallito in alcuni casi. Non è necessario utilizzare 7zip o qualsiasi altro strumento di terze parti. Powershell è un overkill. Cygwin potrebbe funzionare, ma potrebbe non averlo installato. Quindi, focalizziamociamo a una robocopy

L'idea è quella di

  1. utilizzare robocopy per copiare + aggiornare
  2. da una nuova cartella vuota
  3. alla cartella che si desidera eliminare, il destinatario.

Dopo aver esercitato la robocopy, la directory di destinazione sarebbe stata vuota.

Queste istruzioni sono per la row di command. Basta aprire la ricerca in Windows, digitare cmd e premere Invio.

Diciamo che la cartella che vogliamo eliminare, il target, è

C:\delete\this folder\with a very long name

  1. Per prima cosa creare una directory vuota, fi C:\emptyfolder .

    mkdir C: \ emptyfolder

  2. Copia + aggiornamento dalla directory vuota al target, utilizzando l'opzione "/ purge"

    robocopy c: \ emptyfolder "C: \ eliminare \ questa cartella \ con un nome molto lungo" / purge

  3. Eliminare la directory vuota. Non ne hai più bisogno.

    rmdir c: \ emptyfolder

Dal momento che non ci sono file o cartelle nella directory di origine ( C:\emptyfolder ), semplicemente elimina i file e le cartelle sotto la directory di destinazione ( C:\delete\this folder\with a very long name ) in modo ricorsivo!

  • Trucco finale: è ansible evitare di scrivere manualmente

    C: \ delete \ questa cartella \ con un nome molto lungo

    Trascinando la cartella da una window di Explorer e lasciando cadere nella window Terminal / cmd.

Fare attenzione : i file cancellati non passano alla cartella dei rifiuti ! Una volta eliminati, i file non possono essere recuperati.

(Tratto da "Percorso troppo lungo? Usa Robocopy" di BVLANGEN )

Credo di aver trovato un modo per eliminare le cose da cmd . Originariamente ho provato il command del , ma questo non funzionava. Poi mi sono ricordato di rmdir . Eseguire quanto segue:

 rmdir /S /Q <dir> 

sembra aver funzionato.

Lo strumento che ho usato quando ho avuto questo problema era FastCopy . Ho selezionato Elimina tutto dall'elenco a discesa, ho selezionato la directory che volevo eliminare e ho fatto clic su Elimina tutto .

Screenshot di dialogo di eliminazione di FastCopy

FastCopy è porttile (non è richiesta alcuna installazione) e sono disponibili versioni a 32 e 64 bit.

Il rm -rf Cygwin funziona bene su lunghi routes!

Basta scendere dal command Powershell in esecuzione sotto:

 Cmd /C "rmdir /S /Q <dir>" 

La soluzione di Dentrasi è ciò che ha funzionato meglio per me, ma ho voluto pubblicare i passi specifici in una risposta di alto livello.

  1. Scaricare e installare la versione stabile più recente di 7zip .
  2. Esegui 7zip File Manager ( 7zfm.exe ).
  3. Nella Gestione file 7zip, navigare in modo da poter visualizzare il nome della cartella che si desidera eliminare (cioè si trova nella cartella principale).
  4. Tenere premuto il button Maiusc.
  5. Fare clic sul button " Elimina ", sulla tastiera o sulla barra degli strumenti Gestione file 7zip; assicuratevi di tenere premuto il tasto Maiusc .
  6. Fare clic sul button " OK "; assicuratevi di tenere premuto il tasto Maiusc .

Senza l'installazione di software aggiuntivo è ansible utilizzare subst command subst per creare temporaneamente un alias in una directory a lungo nome.

ad esempio se si desidera eliminare la cartella C:\Very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted è ansible utilizzare il command

 subst x: "C:\Very long directory\that exceed\length limit\blah blah blah\abcde" 

e quindi è ansible eliminare X:\folder to be deleted in Esplora risorse o nel prompt dei comandi facilmente. Per rimuovere l'alias della lettera di unità temporanea utilizzare il command

 subst x: /d 

Mi piace la soluzione cmd. Anche se voglio condividere un'altra soluzione che funziona anche solo in Esplora risorse: cercare di abbreviare i nomi delle cartelle padre prima dell'eliminazione: i nomi più brevi abbrevieranno il path. Dire, hai questa struttura ad tree della cartella:

C: \

.. Progetti

.. .. Alcuni progetti impressionanti durante la spring del 2014

.. .. .. Alcune attività nel parco in città un venerdì

.. .. .. .. Bla bla bla bla bla bla bla bla bla bla bla bla

.. .. .. .. .. File effettivi con nomi lunghi, anche

In questo caso non è ansible eliminare le cartelle, non è ansible eliminare né rinominare i file. Se si desidera rimuovere l'intera struttura di una cartella o una parte di esso, è ansible rinominare temporaneamente le cartelle principali e abbreviare il path e quindi rimuovere la cartella. I nomi possono essere solo lettere:

C: \

.. Progetti

.. .. X

.. .. .. y

.. .. .. .. z

.. .. .. .. .. File effettivi con nomi lunghi, anche

Nel mio caso volevo solo rimuovere l'intera cartella con molte sottocartelle e file. Quindi non mi interessavo ai nomi delle cartelle.

Ci sono due cose non già menzionate nelle risposte esistenti.

  1. È ansible utilizzare un prefisso di path di lunghezza estesa per accedere a routes lunghi
  2. Con Windows 10, è ansible abilitare il supporto di path lungo per uso generale. Tuttavia, non tutte le applicazioni utilizzano routes lunghi, è necessario testare un software più vecchio. Solo il software con una voce manifesta appropriata sarà in grado di farlo.

Prefisso lungo path

L'API di Windows ha una function speciale che support i nomi dei routes Unicode fino a 32 caratteri lunghi (each elemento può contenere fino a 255 caratteri).

Questo viene spesso chiamato erroneamente come denominazione UNC, ma non è però collegato.

Il prefisso utilizzato per indicare all'API di utilizzare i routes Unicode lunghi è \\?\ Come in:

 \\?\D:\very long path 

I nomi UNC vengono normalmente usati quando si riferiscono a routes sui server remoti nella forma \\servername\path name\file name . È ansible combinare questo con il prefisso long path: \\?\UNC\server\share

Si noti che alcune applicazioni, scarsamente scritte ma purtroppo piuttosto comuni, non supportno i routes dei file UNC né il prefisso a lungo path.

Riferimento: https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath

Supporto lungo path

Questa è un'opzione che è stata aggiunta alle versioni recenti di Windows 10. Non è, al momento della scrittura, triggersta per impostazione predefinita in quanto richiede un supporto specifico per l'applicazione. È interessante notare che PowerShell ha un supporto integrato in modo da abilitare questa opzione consentirà di utilizzare routes lunghi direttamente negli script PowerShell.

È ansible triggersrlo tramite l'editor di criteri di gruppo se si dispone di una versione di Windows. Oppure è ansible utilizzare il seguente cambiamento del Registro di sistema. Come sempre, si prega di eseguire il backup della sezione del Registro di sistema che stai cambiando prima di fare qualsiasi cosa.

  1. Eseguire regedit.exe .
  2. Confermare il prompt UAC.
  3. Passare alla chiave: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  4. Creare o modificare la chiave LongPathsEnabled .
  5. Se non esiste, fare clic con il button destro del mouse su Criteri e select Nuovo> Dword (32-bit) dal menu.
  6. Impostare LongPathsEnabled su 1 per abilitare.

Tutte le applicazioni con le voci manifeste appropriate avranno ora accesso ai routes longitudinali standard POSIX. Ciò dovrebbe includere applicazioni di Windows Store.

Riferimento: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

AGGIORNAMENTO 2017-04-09

@maoizm ha sottolineato un problema con la chiave del Registro di sistema sopra e ho fatto un po 'di scavo . Sembra che ora è ansible impostare un lungo supporto di file con una chiave di sistema:

 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD) 

Questo funziona ancora solo per applicazioni specificamente impostate per utilizzarlo però (richiede una voce nel manifesto dell'applicazione .xml).

È inoltre necessario notare che non è ansible utilizzare i nomi di path relativi con questo metodo.

Suggerisco Total Commander (shareware, ma continua a lavorare dopo il periodo di prova con solo un minimo start screen nag). Questo è il modo in cui risolvevo tutti i problemi troppo lunghi del nome del file .

La soluzione a 7 zip funziona ottimamente. Un'altra opzione se hai installato git è aprire una shell bash e utilizzare:

rm -f

(o rm -rf per le cartelle)

È anche ansible eliminarli usando il loro nome abbreviato equivalente. dir /x li mostrerà.

Ho creato un semplice programma java che utilizza robocopy per eliminare i file. Il jar è un corridoio. Per l'output aggiuntivo eseguirlo dalla row cmd.

https://drive.google.com/file/d/0B5pSEjxJvt_1WVp1T3puSm1CNjg/view?usp=sharing

Ho provato tutte le altre risposte, ma non hanno funzionato (atleast per me).

Mi sono imbattuto in delinfile e ho lavorato abbastanza bene e presto!

La prova è limitata a 3 azioni / 15 giorni, ma è utilizzabile se si desidera solo eliminare alcune cartelle / file:

Le directory più grandi sono progettate anche per questa attività. immettere qui la descrizione dell'immagine

  • Scaricare
  • Utilizza una chiamata ricorsiva con RemoveDirectoryW per eliminare le directory esistenti
  • Utilizza il proprio repository di file per le directory create di recente
  • I file possono essere spostati dalle directory prima di eliminare le directory di count.
  • Veloce, anche se la navigazione verso la parte superiore della directory è un clic per una directory nidificata
  • Windows XP (SP3) e superiore
  • Codice non gestito non firmato senza installatore, quindi avvertimento Smartscreen quando viene eseguito da cartuccia di riserva, ad esempio desktop.

Maggiori informazioni su CodeProject .

Ho finalmente scoperto come farlo attraverso Powershell. Ecco le istruzioni che ho seguito per get questo per funzionare in Windows 7:

  1. Creare una nuova cartella denominata NTFSSecurity nella cartella C: \ Users \ XXXX \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity , where XXXX è il tuo nome utente di Windows. Esempio: se il mio nome utente era " aspnyc ", la nuova cartella sarebbe C: \ Utenti \ aspnyc \ Documents \ WindowsPowerShell \ Modules \ NTFSSecurity .

  2. Scaricare il pacchetto PowerShell Module File System Security – dovrebbe essere disponibile come semplice file ZIP.

  3. Aprire una console di Powershell, eseguire Get-Module -ListAvailable e assicurarsi che NTFSSecurity si visualizzi in qualche parte nell'elenco dei moduli registrati.
  4. Nella console Powershell, eseguire Import-Module NTFSSecurity .
  5. Nella console Powershell, eseguire Remove-Item2 "YYYY" -Recurse , where YYYY è il path di Windows alla cartella che si desidera eliminare recursivamente (ad esempio C: \ Patate \ Badgers \ FolderToDelete ).

Ho finalmente scoperto come farlo con Powershell su Windows 10 where i singoli nomi di file erano troppo lunghi. Ecco i passaggi che ho seguito per get questo per funzionare in Windows 10:

  1. Scaricare il pacchetto PowerShell Module File System Security – dovrebbe essere disponibile come semplice file ZIP.
  2. Estrarre il file Zip come cartella NTFSSecurity nella directory C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ Module.
  3. Aprire una console Powershell con l'elevazione amministrativa (aka Admin Mode) e eseguire Get-Module -ListAvailable e assicurarsi che NTFSSecurity si visualizzi in qualche parte nell'elenco dei moduli registrati.
  4. Eseguire Set-ExecutionPolicy senza restrizioni per ignorare la modalità di esecuzione firmata. Devi confermare questa azione con un Y (es)
  5. Eventualmente il cd alla cartella che si desidera eliminare.
  6. Nella console Powershell, eseguire Import-Module NTFSSecurity .
  7. Nella console Powershell, eseguire Remove-Item2 "YYYY" -Recurse , where YYYY è il path relativo o assoluto di Windows alla cartella che si desidera eliminare recursivamente (ad esempio C: \ Patate \ Badgers \ FolderToDelete ).
  8. Controllare se ha funzionato.
  9. Eventualmente ritornare alla modalità di esecuzione firmata con Set-ExecutionPolicy Restricted . Devi confermare questa azione con Y (es).

Ho affrontato questo problema in Windows 10 e ho trovato questa soluzione facile.

  1. Entra in un po 'più in profondità della tua struttura di cartelle.
  2. Trascinare e rilasciare una cartella da qualche parte in mezzo all'tree per iniziare da qualche parte dell'tree utilizzando la barra degli indirizzi.
  3. Come nella mia image trascinare e trascinare la casella rossa alla casella verde. (in questo caso il path è più breve, ma per lunghi routes funziona pure)
  4. Poi il tuo path diventa più breve e cancella come normalmente usando il tasto di cancellazione.

immettere qui la descrizione dell'immagine

Se si dispone di Bash su Ubuntu in Windows installato, è ansible eseguire la cd alla directory padre in un prompt di command normale e digitare:

 bash -c "rm -rf dirname_here" 

Quale lancia bash, recursivamente elimina la directory da linux where non ci sono restrizioni di nome di file e quindi esce dal prompt dei comandi normali.