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
robocopy
per copiare + aggiornare 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
C:\emptyfolder
.mkdir C: \ emptyfolder
robocopy c: \ emptyfolder "C: \ eliminare \ questa cartella \ con un nome molto lungo" / purge
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 .
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.
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.
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
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.
regedit.exe
. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
LongPathsEnabled
. 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à.
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:
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 .
Scaricare il pacchetto PowerShell Module File System Security – dovrebbe essere disponibile come semplice file ZIP.
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:
Ho affrontato questo problema in Windows 10 e ho trovato questa soluzione facile.
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.