Windows에서 파일을 삭제, 이름 변경 또는 이동하려고 할 때 "파일이 다른 프로세스에 의해 사용 중입니다"라는 메시지가 나타나는 경우가 있습니다. 보통 파일 탐색기 메시지 창에 해당 파일을 열어둔 프로그램 이름이 함께 표시되기 때문에, 프로그램만 닫으면 간단히 해결됩니다. 하지만 알 수 없는 프로세스나 Windows 시스템 프로세스가 파일을 점유하고 있다면 상황이 달라집니다. 이런 경우 잠금을 해제하기가 훨씬 어렵습니다.
많은 애플리케이션은 파일을 배타적 모드(exclusive mode)로 엽니다. 이때 파일 시스템이 해당 파일을 잠가 다른 앱이나 프로세스의 입출력 작업을 차단합니다. 앱을 종료하면 파일 잠금도 함께 해제됩니다.
파일 잠금 메시지의 종류
파일 잠금 메시지는 다양한 형태로 나타납니다. 아래 예시는 파일 유형과 연결된 앱을 알려주는 메시지입니다.
파일/폴더가 사용 중입니다. 파일이 다른 프로그램에서 열려 있어 작업을 완료할 수 없습니다. 폴더나 파일을 닫은 후 다시 시도하세요.
이런 경우에는 어떤 앱이 파일을 잠갔는지 쉽게 파악할 수 있고, 해당 앱을 종료하면 됩니다.
하지만 때로는 알 수 없는 프로세스나 Windows 시스템 프로세스가 파일을 사용 중이라는 메시지가 표시되기도 합니다. Windows 자체 프로세스일 수도 있고, 백신 프로그램, 백업 에이전트, MSSQL 데이터베이스처럼 System 권한으로 동작하는 프로세스일 수도 있습니다.
파일이 SYSTEM에서 열려 있어 작업을 완료할 수 없습니다. 파일을 닫은 후 다시 시도하세요.
이번 글에서는 어떤 프로그램, 서비스 또는 Windows 시스템 프로세스가 파일을 사용 중인지 확인하는 방법, 파일 잠금을 해제하는 방법, 그리고 부모 프로세스를 종료하지 않고도 잠금을 해제할 수 있는지 알아보겠습니다.
참고로, 공유 네트워크 폴더에서 폴더를 삭제할 수 없다면 문제의 원인은 대부분 폴더 내 썸네일 캐시가 담긴 thumbs.db 파일이거나, SMB 파일 서버에서 다른 사용자가 해당 파일을 열어둔(잠근) 경우입니다.
파일 잠금 해제의 기본 원리
가장 쉬운 방법은 파일을 잠근 프로세스를 종료하는 것입니다. 하지만 특히 서버 환경에서는 항상 가능한 것은 아닙니다.
잠긴 파일을 점유한 프로세스를 찾는 데 Unlocker 도구를 추천하는 경우가 많지만, 필자는 사용하지 않습니다. Unlocker는 파일을 잠근 프로세스나 프로세스 체인에 대한 상세 정보를 제공하지 않고, 프로세스가 사용 중인 파일의 잠금만 해제할 수도 없어 앱 전체를 강제 종료해야 하기 때문입니다. 또한 서드파티 도구라서 설치 시 불필요한 번들 프로그램까지 함께 설치되도록 유도하므로 각별히 주의해야 합니다.
Windows에서 프로세스가 파일을 열면 입출력 스트림에 파일 디스크립터(핸들)가 할당됩니다. 프로세스와 그 자식 프로세스는 이 핸들을 통해 파일에 접근합니다. Windows API를 사용하면 파일 시스템에 신호를 보내 파일 핸들을 해제하고 파일 잠금을 풀 수 있습니다.
주의: 파일 핸들을 강제로 닫으면 앱이나 컴퓨터가 불안정하게 동작할 수 있습니다. 핸들을 닫은 후 어떤 결과가 발생할지 확신이 서지 않는다면, 사전에 충분히 테스트하지 않은 한 운영 서버에서는 시도하지 마세요.
Process Explorer로 파일 잠금 해제하기
Process Explorer는 Microsoft 웹사이트(https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer)에서 다운로드할 수 있는 Sysinternals 키트의 무료 도구입니다. 이 도구로 파일을 잠근 프로세스를 찾고, 해당 프로세스의 파일 핸들을 초기화하여 잠금을 해제해 보겠습니다.
- Process Explorer는 별도 설치가 필요 없습니다. 다운로드 후 압축을 풀고
procexp.exe를 관리자 권한으로 실행하세요. - Find → Find Handle or DLL을 선택하거나
Ctrl+F를 누릅니다. - 잠금을 해제하려는 파일 이름을 입력하고 Search를 클릭합니다.
- 대상 파일을 선택하면 파일을 연 프로세스가 프로세스 트리에서 자동으로 강조 표시됩니다. 마우스 오른쪽 버튼을 클릭해 Kill Process Tree를 선택하면 프로세스를 종료할 수 있습니다. 하지만 프로세스를 종료하지 않고 파일 핸들만 닫는 방법도 시도해 볼 수 있습니다. Process Explorer 하단 패널에서 찾던 파일 핸들이 자동으로 강조 표시되는데, 해당 핸들을 마우스 오른쪽 버튼으로 클릭하고 Close handle을 선택한 뒤 닫기를 확인하면 됩니다.
Process Explorer에서 열려 있는 프로세스 핸들 목록이 표시되는 하단 패널이 보이지 않는다면, View → Lower Pane View → Handles 옵션을 활성화하세요.
이렇게 하면 부모 프로세스를 종료하지 않고도 파일 핸들을 닫을 수 있으며, 이후 파일을 삭제하거나 이름을 변경할 수 있습니다.
Handle 도구로 파일 핸들 해제하기
Handle은 Sysinternals에서 제공하는 또 다른 명령줄 도구입니다(Microsoft 웹사이트에서 다운로드: https://docs.microsoft.com/en-us/sysinternals/downloads/handle). 이 도구를 사용하면 파일을 잠근 프로세스를 찾고, 핸들을 해제하여 잠금을 풀 수 있습니다.
- Handle 압축 파일을 다운로드하고 압축을 풉니다.
- 명령 프롬프트를 관리자 권한으로 열고 다음 명령을 실행합니다:
handle64.exe > listproc.txt - 이 명령은 열려 있는 핸들 목록을 txt 파일로 저장합니다. 대상 파일이 있는 디렉터리의 핸들만 표시하려면
Handle64.exe -a "C:\Program Files\App"을, 특정 프로세스의 핸들을 확인하려면handle64.exe -p excel.exe를 실행하세요. - 아무 텍스트 편집기로 listproc.txt를 열고 잠긴 파일 이름이 포함된 줄을 찾습니다. 파일 핸들 ID(16진수 형식)를 복사한 뒤, 위로 스크롤해 해당 핸들을 소유한 프로세스가 표시된 섹션으로 이동하여 프로세스 ID를 적어둡니다. System 권한으로 실행된 프로세스는 대부분 PID 4를 갖습니다. 일부 Windows 시스템 프로세스의 경우 handle.exe가
wininit.exe pid: 732 <unable to open process>같은 메시지를 반환합니다. 이는 관리자 권한으로도 해당 시스템 프로세스에 대한 정보를 얻을 수 없다는 의미입니다. 이런 프로세스가 연 파일 핸들을 확인하려면 cmd.exe를 System 계정으로 실행한 후 다시 핸들 목록을 조회해 보세요. - 명령 프롬프트로 돌아가 HandleID와 ProcessID를 지정해 파일 핸들을 초기화합니다. 명령 형식은 다음과 같습니다:
handle64.exe -c HandleID -p ProcessID예시:handle64.exe -c 18C -p 18800 - 도구가 프로세스의 파일 닫기를 확인하면
y를 누르고Enter키를 눌러 승인합니다.
시스템이 파일 닫기에 정상적으로 반응하면 프로세스를 종료하거나 서버·컴퓨터를 재시작하지 않고도 파일 잠금을 해제할 수 있습니다.