it-swarm-korea.com

내 Windows 컴퓨터에서 토끼 구멍과 같은 역할을하는 네 개의 점이있는 폴더가있었습니다. 어떻게 그랬습니까?

폴더 이름은 파일 탐색기에 ....로 표시된 네 개의 점으로 표시됩니다.

내가 그것을 열어 보았을 때, 나는 똑같은 폴더를 여러 번 열어 놓은 무한한 토끼 구멍 고리에 들어갔다. 나는 이것을 끝없이 할 수 있었다. C:\ExamplePath\....\....\....\....\.... 등의 경로 표시.

하나의 특정 프로젝트에 내 TypeScript 컴파일을 걸기 시작했습니다. 중첩 폴더에 깊이 뿌리를두고 있기 때문에이 폴더와 관련 문제를 발견하기까지는 1 년 이상이 걸렸습니다. 나는 이런 문제를 결코 예상하지 못했기 때문에 결코 그것을 찾지 못했습니다.

특별한 이름 때문에 폴더를 정상적으로 삭제할 수 없습니다. 결국 명령 줄을 사용하고 rd /s /q path을 사용하여 상위 폴더를 삭제하여 제거 할 수있었습니다.

이후에 폴더를 다시 만들려고했지만 파일 탐색기와 명령 줄을 사용하여 폴더를 만들지 못했습니다.

Windows를 사용하는 20 년 동안 나는 전에이 버그를 본 적이 없었기 때문에 아마추어 사용자에게는 정말 짜증나고 혼란스런 문제가 될 것이라고 상상할 수 있습니다.

아무도 이것이 일어날 수있는 방법과이 문제를 재현하는 방법을 알고 있습니까?

업데이트

관심있는 사람들을 위해 :이 경로는 TFS 폴더 안에 있습니다. 그래서 아마도 TFS는 우회 방법을 사용합니다. @grawity ( "다양한 파일 관리자, 아카이브 등")

나는 드문 TFS 버그에 걸려 들었습니까?

197
Dirk Boer

Win32는 이름이 .로 끝나는 파일이나 폴더를 만들 수 없으며, 모든 점이 끝에서 제거됩니다. test.를 만들려고하면 test이 대신 나타납니다. (이는 구형 DOS/Win9x 시대 소프트웨어의 8.3 이름과의 호환성을위한 것입니다.)

결과적으로 ....라는 폴더에 액세스하려고 할 때마다 이름이 빈 문자열로 줄어들고 이전에 있던 폴더로 되돌아갑니다.

그러나 NT 커널은 그러한 이름을 허용합니다. Win32 API에 의해 부과 된 파일 이름 제한을 우회하는 다양한 메커니즘이 있습니다. 예를 들어, WSL (Linux 용 Windows 서브 시스템)은 Win32에서 실행되지 않고 영향을받지 않습니다. 또한 \\?\ 우회 방법, 의도적 인 "백도어"가 그들이 무엇을하는지 알고있는 프로그램에 남겨 둡니다. C:\Example\....\을 만들 수는 없지만, \\?\C:\Example\....\ 만들 수 있습니다.

마찬가지로 Cmd에서 rmdir \\?\C:\path\...를 사용하여 이러한 디렉토리를 삭제할 수 있습니다 (아직 PowerShell로 테스트하지 않았습니다).

다양한 파일 관리자, 아카이버 등은 평소보다 긴 경로 이름을 사용할 수 있도록 \\?\ 메소드를 사용할 수 있습니다. 그렇게함으로써 Win32 내의 호환성 코드의 영향을받지 않습니다. CON 또는 NUL과 같은 마술 파일 이름의 번역은 물론 도트 스트리핑을 무시합니다.

그래서 그것은 여러분의 프로그램 중 하나 일 수 있습니다 :

  1. 항상 \\?\를 사용하여 파일에 액세스하고,
  2. 실수로 ....라는 폴더를 만들려고했지만 사실 이후에 확실히 알 수는 없습니다.
303
grawity

@ grawity의 대답 외에도 Win32 프로그램은 "native"API를 직접 호출하여이를 수행 할 수 있습니다. 내가 실수하지 않는다면, 현재 NtCreateDirectoryObject가 될 것입니다. 이러한 호출은 요즘 특히 커널 관련 문서 (Win32 프로그램에서 호출 할 수 없음) (이 경우에는 ZwCreateDirectoryObject)와 같이 잘 문서화되어 있습니다.

"끝없는 깊이"에 관해서는, 이것을 달성하는 쉬운 방법은 링크를 사용하는 것입니다. 디렉토리를 만든 다음 내부에 디렉토리를 만들고 (예를 들어 mklink /j를 사용할 수 있습니다) 매우 깊이있는 구조로 끝납니다. 마지막으로 Windows 2000에서이 작업을 수행했지만 재귀가 끝났습니다 ( "무한히"무시할 수는 없었습니다). 가능하면 최신 OS에서 한계가 더 크거나 제거되었습니다. 또한 10 개의 디렉토리가 각각 이전 디렉토리의 하위 디렉토리가되도록 만들고 10 번째 디렉토리에서는 첫 번째 디렉토리로 다시 링크를 작성합니다.

22
user1532080

디렉토리를 만드는 더 쉬운 방법이 있습니다. 프롬프트 유형 프롬프트에서 다음을 입력하십시오.

MD ....\

enter 키를 누르면 4 개의 점으로 된 디렉토리가 생성됩니다. 이 디렉토리는 Explorer에서도 볼 수 있습니다.

버전 1.0으로 돌아가는 MS-DOS의 결함이 있습니다. MS는 얼마 동안 그것을 알고 있었지만 그것을 고칠 수는 없었습니다. PowerShell을 사용하여 문제를 해결했습니다.

BTW, 시도하는 경우 :

RD ....

삭제에 실패합니다. 이 특정 구문을 사용하여 제거해야합니다.

RD ....\

나는 내가 관리하는 특정 서버에서 이것을 사용한다. 나는 종종 디스크의 루트에 사용자 폴더를 만들고 다른 관리자가 와서 제거하려고하지 않습니다.

그래서 나는 내 폴더 안에 들어가서 CON, AUX, LPT 등의 하위 폴더를 만들 것입니다.

다른 관리자가 내 폴더를 제거하려면 먼저이 하위 폴더를 제거하는 방법을 알아야합니다.

편집 : 나는이 토론에 대해 오늘 아침에 생각하고 있었고 나는 이것을 한 걸음 더 나아갈 결심했다. 나는 이것이 관련이 있는지 개조 조종사가 결정할 것이라고 추정한다.

폴더에 CD를 넣을 수 없습니다.

MD c :\test라면 CD C :\test와 MD ....\나는 C :\test ...로 끝납니다.

모든 것이 잘됩니다.

하지만 CD .... 실패하고 다시 C :\test로 데려옵니다. (CD .... \는 동일합니다.)

그러나 나는 DIR .... 할 수 있고 dir 명부 작성을 얻는다. 나는 또한 할 수있다.

MD C :\test ....\temp 그리고 그 하위 디렉토리를 만듭니다 ....

나는 또한 CD C :\test ....\temp 일 수 있고 그 이하 서브 디렉토리로 들어갈 수있다.

그러나 C :\test ....\temp에있는 동안 CD라면 .. 나는 C :\test로 돌아왔다.

그 디렉토리에 CD를 넣을 수는 없지만, 하위 폴더를 생성하여 폴더를 조작 할 수 있습니다.

ECHO "Testing">> C :\test ....\test.txt

또한 작동하고 해당 폴더에 파일을 만듭니다. 그래서 4 개의 점이있는 폴더를 만들 수 있습니다. 파일과 폴더를 추가 할 수 있습니다. 목록을 가져올 수는 있지만 CD로 옮길 수는 없습니다. 이것에 악의적 인 천재적 사용이있을 수 있습니까? 내가 코스에서 너무 멀어지면 개조 팀에 사과해야한다.

17
Larryc