파일을 삭제하려고 할 때이 파일이없는 이유는 무엇입니까?


9

한 달 정도 전에 Cygwin의 폴더에서 Linux 소스를 압축 해제했습니다 (Linux를 실행하는 다른 컴퓨터가 느린 단일 코어 Sempron이기 때문에 MinGW로 컴파일할지 여부가 궁금했습니다). 삭제를 시도했지만 파일이 1 개 남아 있으며 삭제되지 않습니다 ...

Cygwin은에 거주하고에 C:\cygwin소스를 압축 해제했습니다 C:\cygwin\src\linux-3.7.1. 컴파일되지 않았습니다 ... 폴더를 삭제하려고했습니다. 모든 파일이 삭제되는 것은 아니라는 것을 깨달을 때까지는 잘 진행되었습니다. linux-3.7.1폴더 삭제를 다시 시도했는데 오류가 발생했습니다.

아이템을 찾을 수 없습니다

나는 폴더를 열어, 왼쪽 1 개 소스 파일이 있다는 발견 aux.c에 있습니다 C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c.

그건 그렇지 않을거야:

  • 지우다
  • 열다
  • 움직임

일반 속성 :

일반

보안 속성 :

보안

이 파일을 어떻게 제거합니까?


좋아, 순간에 그것을 실행
알렉스

완료되었지만 작동하지 않았습니다 ...
Alex

1
작동하지 않아야합니다. DOS / 윈도우에서 삭제할 수 없습니다. 따라서이 방법으로 해결할 수있는 오류는 아닙니다.
Hennes

답변:


14

(높은) 명령 프롬프트에서 이것을 시도하십시오.

del \\?\C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c

Ok aux.c는 삭제되었지만 이제는`src` 폴더를 삭제하려고 할 때 분명히 사용 중입니다.
Alex

그 안에 아무것도 숨겨져 있습니까? 아마도 rd /s /q \\?\C:\cygwin\src도움이 될 것 입니다.
카란

`src`가 사용중인 출력을 인쇄합니다.
Alex

2
Karan : 아, 영리 해요. 일반적인 파일 시스템 네임 스페이스를 피하십시오. @Alex Yan : 폴더에 cmd 창이 열리지 않습니까?
Hennes

그래, rd는 폴더 또는 그 안의 파일을 잡지 않는 한 트릭을 수행해야합니다 ... 열려있는 다른 모든 창 / 응용 프로그램을 닫고 src의 속성을 확인하십시오. 표시된 파일의 크기와 수는 얼마입니까?
카란

13

당신이 부딪친 문제는 고대 DOS 예약 때문입니다.

아래 목록의 파일에는 특별한 의미가있었습니다. 그 중 일부는 여전히 최신 Windows 버전에 있습니다.

CON, PRN, AUX , CLOCK $, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 및 LPT9.

파일을 삭제하는 가장 쉬운 방법은 이러한 파일 이름을 특별하게 취급하지 않는 운영 체제를 부팅하는 것입니다. (예 : Windows 이외의 liveCD 부팅)

[편집] win7-x86에서 수행 된 테스트 :

간단한 테스트 파일 만들기 :

S : \> copy foo.c 복사
테스트
^ Z
        1 개의 파일이 복사되었습니다.

내용 확인 :

S : \> 유형 foo.c
테스트

이제 aux .c

S : \> 복사 con aux.c
^ Z
시스템이 지정된 파일을 찾을 수 없습니다.
        0 개의 파일이 복사되었습니다.

여전히 창의 일부가 이전 버전과 호환되는 것 같습니다.


하지만이 파일은aux.c
Alex

3
여전히 aux로 시작하고 이전 파일 이름 스타일은 "Filename"dot "extension"입니다. 그리고 방금 copy con aux.cwin7에서 테스트 했는데 실패했습니다. ( copy con test.c작동합니다).
Hennes

7

이 경우는 대해 분명히했다 특별한 의미 auxDOS 시간에서 상속 으로, 헤 네스가 올바르게 지적했다. 그러나 앞으로이 문제를 극복하는 독자들을 위해이 동작을 볼 수있는 또 다른 가능한 사례를 추가하고 싶습니다.

이때 파일이 후행 점으로 만들어졌습니다. 더 이국적인 경우도 있습니다. 그러나 filename.ext.이러한 파일 이름은 일반적으로 Win32 하위 시스템에서 삭제할 수 없습니다. 이것은 Karan 의 속임수가 들어온 곳 입니다. S / 그는 Win32 하위 시스템 아래의 계층으로 전달되기 전에 해당 \\?\C:\...형식에서 "기본"(파일 시스템 필터 드라이버가 보는 방식) 으로 변경 될 이름을 사용합니다. 양식 \??\C:\.... Windows 버전에 따라 소위 객체 디렉토리 (Sysinternals / Microsoft의 WinObj를 사용하여 객체 관리자 네임 스페이스를 들여다 보거나) 또는 심볼릭 링크 (Vista 이후 NTFS에서 동일한 이름의 엔티티와 혼동하지 않아야 함) 일 수 있습니다. 다른 객체 디렉토리 (예 :\DosDevices. 후자는 하나의 이름 일 뿐이며 기본적으로 Win32 프로세스에 표시되는 개체 관리자 네임 스페이스 부분을 설명합니다. 자세한 내용은 Windows 내부 서적 시리즈를 확인하거나 특히 Google의 Project Zero (Win32에서 NT 경로로의 최종 안내서)에서 경로 구문 분석에 대해 읽어보십시오 . 특히 Win32 파일 네임 스페이스Win32 장치 네임 스페이스 의 차이점에주의를 기울여야 할 수 있습니다 .

이제 어떻게 그런 파일을 처음에 만들 수 있습니까? 몇 가지 가능성이 있습니다.

  1. \\?\X:사용 가능한 경로 길이를 260 자에서 약 32767 자 (각주 1 참조)로 확장하기 위해 경로 이름에 접두사를 사용하는 Win32 프로그램 은 처음에 파일을 생성 하여 Win32 하위 시스템의 일부 제한 을 우회 했습니다 .
  2. 다른 서브 시스템에 뿌리를 둔 프로그램 이전 POSIX 하위 시스템 (이후 Interix는 이제 SUA), OS / 2 하위 시스템 (오래되었지만 NT 3.51에 존재 했음) 또는 Windows 의미의 하위 시스템이 아닌 일부 계층 (Cygwin, 내 지식) 파일 또는 폴더 마찬가지로 Windows 10의 WSL (Linux 용 Windows 하위 시스템) 도 이제 다른 후보입니다.
  3. 다른 운영 체제에서 생성했습니다 (예 : 병렬 Linux 부팅).
  4. Windows 이외의 서버에있는 네트워크 공유에있는 파일입니다.

마지막 두 지점은 언급 된 해결책 중 하나를 암시합니다. Windows 이외의 라이브 CD를 부팅하고 파일을 제거하십시오.

이 문제는 기존의 비 유니 코드 Win32 프로그램이 여러 코드 페이지의 파일 이름에 직면하는 경우와 실제로 비교할 수 있습니다. 때때로 각각의 각 ANSI 코드 페이지는 256 자만 사용할 수 있지만 UTF-16 (하위 하위 집합 UCS-2는 아님)은 이론적으로 거의 무제한의 코드 포인트를 인코딩 할 수 있기 때문에 일부를 "찾을"수없는 경우가 있습니다. ( unicode.orgWikipedia 에서 주제를 읽으십시오 ).

이것이 근본적인 문제를 조금 더 이해하는 데 도움이되기를 바랍니다. 가 있지만, 다른 답변 중 하나에이 긴 대답을 편집하고 싶지 않았다 단지 를 보완한다. 다른 답변은 이것 없이는 완벽하게 유효합니다.


각주 1 : 경로의 최대 문자 수는 절대 최대 값이 아닙니다 (32767 자). 객체 관리자와 파일 시스템 필터 또는 파일 시스템 자체 (예 : 재분석 지점) 모두에 의해 경로가 확장 될 수 있기 때문입니다. .


추가 된 기술적 배경이 마음에 듭니다.
Hennes

0

나는이 문제가 있었고 매우 좌절했고 아무것도 효과가 없었다. 그런 다음 Linux Ubuntu CD를 사용했습니다. CDROM에서 부팅하여 데모 모드로 전환하여 번거로운 파일이있는 위치에 액세스하여 간단히 삭제했습니다. 그것은 꿈처럼 작동합니다.


1
Windows에서 파일을 삭제할 수없는 이유는 Windows에서 허용되지 않는 문자가 Linux의 파일 이름에 입력 되었기 때문일 수 있습니다. 리눅스가 신경 쓰지 않기 때문에 그렇지 않다고 확신합니다. 중재자에게 텍스트 일부 제거를 승인하고 사용 가능한 부분을 유지하도록 요청했습니다.
Mogget
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.