Como excluir uma pasta cujo nome terminou com um ponto (“.”)?

90

Recebi algumas pastas criadas por malware cujo nome terminava com um ponto, como C:\a.\ou C:\b.\etc.

Eu encontrei uma solução que pode remover essa pasta com o comando, rd /q /s "C:\a.\"mas se eu chamar o win API RemoveDirectory, ele retorna ERROR_FILE_NOT_FOUND.

E eu só me pergunto como escrever uma função para excluir esse diretório, obrigado

Eu testo em meu próprio sistema Windows XP SP3 assim

criar uma pasta C:\>mkdir a..\\\e não posso clicar duas vezes para acessar essa pasta. e posso remover com o comando rd /q /s "C:\a.\"

quais API (s) do sistema Windows esse rd /q /scomando chama?

jerry.liu
fonte
Não acredito que isso ainda aconteça no Windows 10, pelo próprio Windows update (não foi possível deletar o Windows.old após a atualização).
Damn Vegetables

Respostas:

149

Aqui está uma solução para este problema :

rd /s "\\?\C:\Documents and Settings\User\Desktop\Annoying Folder."
Skilldrick
fonte
1
A questão quer uma função API para remover a pasta e afirma que pode ser removida com rd.
Jcl
4
Muito justo - talvez seja por isso que não está marcado como a resposta aceita, mas, no entanto, é muito útil para quem está preso com o mesmo problema, mas onde podemos usar rd.
david.barkhuizen
2
Você acabou de salvar meus nervos. Obrigado! : D
Benny Neugebauer
8
Observe que isso só funciona no CMD.exe, NÃO no PowerShell
Lorne K de
2
também tente executar CMD.exeno modo de administrador também se não funcionar no prompt de comando não elevado
greg
63

Solução: ao chamar RemoveDirectory, certifique-se de prefixar o caminho com a string " \\?\".


Explicação: Tem tudo a ver com o ponto. De acordo com o MSDN, há certos casos em que você pode não ser capaz de excluir um arquivo ou pasta em um volume NTFS, especificamente quando o nome do arquivo é inválido no namespace do Win32 (é por isso que você não consegue abrir o arquivo usando o métodos normais no Windows Explorer).

Você pode não conseguir excluir um arquivo se o nome do arquivo incluir um nome inválido (por exemplo, o nome do arquivo tem um espaço ou ponto final ou o nome do arquivo é composto apenas de um espaço). Para resolver esse problema, use uma ferramenta que use a sintaxe interna apropriada para excluir o arquivo. Você pode usar a sintaxe "\\? \" Com algumas ferramentas para operar nesses arquivos, por exemplo:
del "\\? \ c: \ path_to_file_that contém um space.txt à direita"
A causa desse problema é semelhante à Causa 4. No entanto, se você usar a sintaxe Win32 típica para abrir um arquivo que tenha espaços ou pontos finais em seu nome, os espaços ou pontos finais são removidos antes que o arquivo real seja aberto. Portanto, se você tiver dois arquivos na mesma pasta chamados "AFile.txt" e "AFile.txt" (observe o espaço após o nome do arquivo), se tentar abrir o segundo arquivo usando chamadas Win32 padrão, você abre o primeiro arquivo. Da mesma forma, se você tiver um arquivo cujo nome é apenas "" (um caractere de espaço) e tentar abri-lo usando chamadas Win32 padrão, abra a pasta pai do arquivo. Nessa situação, se você tentar alterar as configurações de segurança nesses arquivos, você pode não conseguir fazer isso ou pode alterar inesperadamente as configurações em arquivos diferentes.

(Fonte: http://support.microsoft.com/?kbid=320081 )

Cody Gray
fonte
Funcionou perfeitamente para eu deletar um arquivo com seu nome terminando por ".". Muito obrigado !
AFract
1
Funcionou alternando del para rd likerd "\\?\C:\Users\ahmed\Desktop\buggy."
guneysus
Isso funciona muito bem no cmd, mas há um equivalente para PowerShell? rdem pwsh é um apelido remove-itemque não suporta `\\? \`.
Kagami Sascha Rosylight
1
Claro que sim. Acabei de usar o rd do PowerShell para excluir esse arquivo e funcionou muito bem. Verifique sua sintaxe.
SilverbackNet
Uau. Tropecei neste problema ao tentar fazer algum processamento de linguagem natural em um conjunto de dados (cada arquivo no conjunto de dados tem um nome {IncrementalNumber}.) e fiquei muito confuso sobre por que meus scripts de processamento de dados estavam falhando. Isso agora faz sentido, mas parece que o comportamento é tão inesperado que pode ter ramificações de segurança devido ao fato de os aplicativos lidarem incorretamente com nomes de arquivos que terminam em um espaço ou ponto.
Spencer D
46

Eu postei isso no SU e decidi postar aqui também. É a maneira mais simples, rápida e fácil de conseguir isso. Agora estou rindo de como isso é simples.

  1. Instale WinRAR
  2. Siga o procedimento passo a passo a partir das fotos:
  3. insira a descrição da imagem aqui
  4. insira a descrição da imagem aqui
  5. insira a descrição da imagem aqui
  6. insira a descrição da imagem aqui

Eu mesmo instalei o WinRaR, então decidi demonstrar a solução alternativa nele.
Esta solução alternativa também é possível usando 7zip.

Outra coisa que devo mencionar é que, como parece que o problema é causado pelo uso do Windows Explorer e qualquer outro navegador de arquivos (como o próprio navegador de arquivos winrar, exploradores ftp etc.) tratará esses arquivos como normais.
Você pode tentar usar qualquer navegador de arquivos e simplesmente excluir esses arquivos e não se preocupar em arquivá-los! Felicidades!

AmirHossein
fonte
6
Que solução criativa!
Nosgoroth de
9

Se você tiver o git instalado (você pode obtê-lo aqui ), é tão simples como:

  1. Navegue pelo File Explorer até o local onde a pasta problemática está localizada.
  2. Menu de contexto (botão direito do mouse)> Git Bash aqui.
  3. rm -rf Foldername./
Laurynas Lazauskas
fonte
rm: cannot remove ‘.bin’: Directory not empty
Verde,
@Green se você tiver permissão para excluir o conteúdo da pasta, a -rfparte deve cuidar do conteúdo da pasta.
Laurynas Lazauskas,
8

Quando você vê o nome é "a.", Mas o nome real é "a .."

Experimente isto:

rd /q /s "C:\a..\"

E você pode tentar explorar a pasta por este código:

for /f "tokens=3 delims=<>" %%a in ('dir /ad /x "C:\*" ^| findstr " a\.\.$"') do (
  for /f "tokens=1" %%b in ("%%a") do start "" "%%~fb"
)
neorobin
fonte
5

Eu usei " WinRar " Um processador RAR simples, ZIP. Você pode usar qualquer tipo de editor de nome de arquivo. Basta abrir o diretório onde seu arquivo está no WinRar e selecionar renomear após clicar com o botão direito no arquivo / pasta que deseja renomear e preencher o novo nome.

Ariano
fonte
Como isso pode ajudar?
Tavo
1
Ajuda você a navegar no arquivo / pasta e renomear o arquivo para qualquer coisa ... e pronto.
Ariano de
1
Isso realmente me ajudou; Eu tinha usado o WinRar para descompactar um monte de arquivos, um dos quais incluía uma pasta terminando em um ponto. O Windows não conseguiu excluí-lo ou realmente renomeá-lo, mas eu poderia renomeá-lo sem problemas no WinRar e excluí-lo no Windows Explorer (win 10). Obrigado!
Nick May
2

Tente usar o programa unlocker para excluir arquivos e pastas que você não pode excluir normalmente.

RyuuGan
fonte
3
Estou curioso para saber como o destravador pode fazer isso!
jerry.liu
0

Use o comando bash rm do Ubuntu no Windows 10

Kreker
fonte
rm: cannot remove ‘.bin’: Directory not empty
Verde,
0

se você quiser manter os arquivos, também há opções no bash.
você precisará do pacote de subsistema do Windows para Linux (tenho o Ubuntu instalado)

para manter os arquivos. abra um prompt de comando e cd para onde o arquivo ou pasta está localizado.
agora digite " bash"
isso abrirá o bash no prompt. agora digite mv '[folder or file you want to move]' '[new name (can include path)]'(há mais para mv então se você quiser ler todas as suas opções use 'man mv' isto irá abrir sua página de manual (então use q para retornar ao bash))
o comando mv é uma abreviação de move, mas é tem uma função secundária de renomear as coisas.
também no bash use 'aspas simples' e não as "aspas duplas" normais, pois o bash espera 'aspas simples'.

aqui está um exemplo. suponha que sua pasta tenha o nome " data 1." localizada em c:\users(portanto, o caminho completo para a pasta de erro é c:\users\data 1.
1. abra o prompt de comando usando qualquer método
2. digite cd c:\users
3. agora digite basheste carrega bash na pasta em que você estava anteriormente
4. finalmente digite mv 'data 1.' 'data 1'
5. a pasta agora está acessível e você pode optar por excluí-la.

mer2329
fonte