Linux / Mac에서 할 수있는 것처럼 Windows에서 읽는 파일의 이름을 변경할 수없는 이유는 무엇입니까?


23

Linux를 사용하기 시작한 이래로 당황한 것 중 하나는 파일 이름을 변경하거나 파일을 읽는 동안 파일을 삭제할 수 있다는 사실입니다. 예를 들어 비디오가 재생되는 동안 실수로 비디오를 삭제하려고 시도한 방법이 있습니다. 나는 성공했으며 지금 당장 사용되고 있는지 여부를 신경 쓰지 않고 파일의 모든 내용을 변경할 수 있다는 사실에 놀랐습니다.


2
잠긴 파일의 이름을 바꾸는 것은 Windows에서 문제가되지 않습니다. 일반적으로 FILE_SHARE_DELETE 옵션을 설정 한 상태에서 파일을 여는 프로그램은 거의 없습니다.
한스 Passant

실제로 삭제하지 않았고, 디렉토리에있는 링크를 해제했습니다. 파일이 여전히 존재합니다. 파일 시스템에 이름이 없을 수도 있습니다. ( /proc파일 시스템에 열려있는 프로그램을 통해 파일 이름이 여전히 남아 있지만 ) 파일에 대한 참조가없는 경우에만 파일을 완전히 삭제할 수 있으며 이는 자동으로 수행됩니다.
David Schwartz

답변:


36

Windows에서 파일을 열거 나 실행할 때마다 Windows가 파일을 제자리에 잠급니다 (단순하지만 일반적으로 적용됩니다). 프로세스에 의해 잠겨있는 파일은 해당 프로세스에서 파일을 해제 할 때까지 삭제할 수 없습니다. 그렇기 때문에 Windows가 자체적으로 업데이트되어야 할 때마다 재부팅해야합니다.

반면, Linux 및 Mac OS X와 ​​같은 Unix와 유사한 운영 체제는 파일을 잠그지 않고 기본 디스크 섹터를 잠급니다. 이것은 사소한 차이로 보일 수 있지만 파일 시스템 목차의 ​​파일 레코드는 이미 파일이 열려있는 프로그램을 방해하지 않고 삭제할 수 있음을 의미합니다. 따라서 파일이 여전히 실행 중이거나 사용 중일 때 파일을 삭제할 수 있으며 파일 테이블의 항목이 없어도 일부 프로세스에 대해 열린 핸들이있는 한 디스크에 계속 존재합니다.


2
이 답변에 감사드립니다. 그 차이를 훨씬 더 설명해줍니다. 또한 대용량 파일 / 비디오를로드 할 때 엄청난 양의 RAM을 차지하지 않는 이유를 설명하는 데 도움이됩니다. 그렇지 않으면 하나의 큰 비디오를 재생하면 전체 시스템이 다운 될 수 있습니다.
Jerry Saravia

4
사용중인 파일을 삭제하고 Linux에서 파일을 다시 가져 오려면 이 질문에 설명 된대로 / proc에서 파일 항목을 찾을 수 있습니다.
Ken Bloom

2
이것은 다소 일반화입니다. 요즘 Windows 7의 모든 Windows 업데이트가 재부팅을 요구하는 것은 아니며 Linux에서 많은 작업을 수행했습니다.
Alan B

10

Windows는 기본적으로 자동 필수 파일 잠금으로 설정됩니다. UNIX는 기본적으로 수동 협업 파일 잠금으로 설정됩니다. 두 경우 모두 기본값을 무시할 수 있지만 두 경우 모두 일반적으로 그렇지 않습니다.

많은 오래된 Windows 코드는 fopen네이티브 API (같은 함수) 대신 C / C ++ API (같은 함수 CreateFile)를 사용합니다. C / C ++ API는 필수 잠금 작동 방식을 지정할 수있는 방법을 제공하지 않으므로 기본값을 얻게됩니다. 기본 "공유 모드"는 "충돌"조작을 금지하는 경향이 있습니다. 쓰기 위해 파일을 열면 실제로 파일에 쓰지 않는 경우에도 쓰기가 충돌하는 것으로 간주됩니다. 이름 변경을위한 Ditto

그리고 여기가 악화되는 곳이 있습니다. C / C ++ API는 읽기 또는 쓰기를위한 열기 외에 파일로 수행 할 작업을 지정할 수있는 방법을 제공하지 않습니다. 따라서 API는 법적 작업을 수행한다고 가정해야합니다. 잠금은 필수이므로 코드가 충돌 작업을 수행하지 않고 다른 목적으로 파일을 열었더라도 충돌 작업 open허용 하는 잠금은 거부됩니다.

따라서 코드가 C / C ++ API를 사용하거나 이러한 문제에 대해 구체적으로 생각하지 않고 네이티브 API를 사용하는 경우 가능한 모든 작업을 수행하지 않으면 파일을 열 때마다 가능한 최대 작업 집합을 방해하고 파일을 열 수 없게됩니다. 일단 열면 충돌하지 않고 수행 할 수 있습니다.

제 생각에는 모든 프로그램이 공유 모드를 선택하고 현명하고 현명하게 실패한 경우를 처리하면 Windows 방법이 UNIX 방법보다 훨씬 효과적입니다. 그러나 코드가 이러한 문제에 대해 생각하지 않으면 UNIX 방법이 더 효과적입니다. 불행히도 기본 C / C ++ API는 공유 모드를 처리하고 충돌하는 방식으로 Windows 파일 API에 제대로 매핑되지 않습니다. 따라서 최종 결과는 약간 지저분합니다.


0

이것은 매우 흥미로운 질문이며 실행 가능한 답변에 대해 생각하게했습니다. 다른 사람들이 여기에 백업을 제공 할 수 있기를 바랍니다.

나는 Windows와 Linux를 모두 사용하고 이것을 눈치 notice습니다. 나는 또한 vim의 사용자입니다. Vim은 텍스트 파일을 '버퍼'또는 RAM으로 읽은 다음 저장할 때까지 실제 파일을 건드리지 않습니다. Linux는 일반적으로 모든 파일에 대해 이러한 종류의 작업을 수행 할 수 있습니다.

예를 들어 비디오를 가져 와서 가능하면 비디오를 모두 RAM으로 읽은 다음 쉽게 액세스 할 수 있고 탐색 가능하며 점프 가능한 비디오 사본을 확보 할 수 있습니다. 파일이 너무 크면 Linux에서 전체 비디오를 읽지 못할 수 있으므로 문제가 발생할 수 있습니다. 플레이어가 버퍼링 된 비디오의 끝에 도달하면 파일을 다시 읽으려고 시도합니다. 당신이 비디오를 삭제 한 경우 그것은 당신을 위해 짜증.

Windows는 그렇게 할 수 없기 때문에 경우에 따라 훨씬 '안전한'OS입니다. Linux와 동일한 방식으로 파일을 버퍼링 할 수 있지만 파일 잠금을 추가하여 사용자 또는 다른 프로그램이 작업중인 파일이나 변경중인 파일을 변경하지 못하도록합니다. 이를 통해 파일을 그대로 유지하고 사용자 나 다른 프로그램이 서로의 변경 사항을 덮어 쓰지 못하게합니다.


실제로 삭제할 수 없습니다 . 그냥 옮기고 이름을 바꾸십시오.
Daniel Beck

2
당신은 그것을 'rm'할 수 있습니다. 삭제하기에 충분합니다.
Chris Moore
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.