사용중인 파일 이동 — 작동 방법


31

나는 비 Windows OS에서 .... linux / mac에서 다음과 같은 일을 할 수 있음을 알아 차렸다 :-목표를 통해 친구에게 우편 번호 보내기-파일이 전송되는 동안 삭제

그리고 전송은 실패하지 않습니다.

또는, 다음과 같은 작업을 수행 할 수 있습니다.-동영상 시작-파일 지우기-동영상이 계속 재생됩니다 (메모리에 버퍼링 된 것이 아니라 디스크에서 읽음).

앞에서 언급했듯이 파일은 "삭제"되지만 실제로 파일 시스템의 다른 위치 (예 : 휴지통 디렉토리)로 이동됩니다. 따라서 OS가 파일에 직접 액세스하지 않고 이동할 때 업데이트되는 파일 @ 포인터를 사용하는 것처럼 보입니다.

이 AWESOME 기능이 실제로 어떻게 구현되는지에 대해 누구나 밝힐 수 있습니까? 나는 그것에 대해 더 많이 배우기 위해 구글에 무엇을 해야할지조차 확실하지 않습니다.

고맙습니다.


1
이론적으로는 두 가지 방법이있을 수 있다고 가정합니다. 둘 다 현실입니다. 파일이 메모리에 있습니다. 또는 파일 시스템에 파일에 대한 참조가 있으며 참조 만 삭제됩니다. 둘 다 현실입니다. 참조 사실은 삭제 취소 프로그램이 삭제를 취소하는 방법입니다. 파일을 닫는 모든 프로그램이 닫히면 파일이 실제로 삭제된다는 생각은 말도 안되는 것처럼 들립니다. 링크 된 목록 (프로그래밍 데이터 구조, 개념을보다 깊이 이해하기 위해)을 찾을 수 있습니다. 또는 특정 파일 시스템을 찾아 볼 수도 있습니다.
barlop

답변:


29

디렉토리 엔트리는 단지 inode에 대한 포인터입니다. inode에는 파일에 대한 메타 정보 (이름 이외)와 파일 데이터에 대한 포인터 (있는 경우)가 포함됩니다. 파일 복사를 시작하면 inode에 핸들이 생깁니다.

운영 체제는 inode에 대한 참조 수를 유지합니다. inode에 대한 참조가있는 한 inode와 파일의 데이터는 유지됩니다. inode에 대한 모든 참조가 제거되면 inode가 있고 파일에 필요한 공간이 해제됩니다.

복사 할 파일이 열려 있으면 프로세스가 파일을 닫을 때까지 파일이 유지됩니다. 파일 전송이 완료되면 복사 프로세스가 실패하면 발생합니다. 파일 전송이 도중에 실패하고 파일에 대한 모든 하드 링크를 삭제 한 경우 전송을 성공적으로 다시 시작할 수 없습니다.

편집 : 다른 사람이 지적했듯이 동일한 장치에서 파일 이동은 데이터를 이동하지 않고 수행됩니다. 대신 대상 디렉토리에 새 디렉토리 항목이 작성되고 원래 디렉토리 항목이 제거됩니다.

동일한 파일에 대해 여러 디렉토리 항목을 가질 수 있습니다. 이것을 하드 링크라고합니다. 원래 항목을 제거하지 않고 파일에 대한 새 디렉토리 항목을 작성하여 작성됩니다. 파일 시스템의 inode에는 파일을 가리키는 디렉토리 항목 수를 기록하기위한 참조 횟수가 있습니다.

EDIT2 : 프로세스가 충돌하거나 종료되면 메모리 액세스 횟수가 0으로 줄어들어 파일이 완전히 제거됩니다. 프로그램이 정상적으로 종료 될 때 발생하는 동작입니다.

정전 또는 기타 순서없는 시스템 종료의 경우 디스크를 fsck완전히 마운트하기 전에 (파일 시스템 검사) 가 필요합니다 . 온 디스크 inode 및 디렉토리 구조의 상태에 따라 공간이 복구되거나 파일이 디렉토리에 남아 있거나 디렉토리에 새 항목이 작성됩니다 lost+found. 결과는 디스크로 플러시되거나 파일 시스템 저널에 기록 된 변경 사항에 따라 다릅니다.


5
정확하게. 나 자신을 더 잘 넣을 수 없었습니다. 또한, 프로그램 내에서 스크래치 파일 저장 공간이 필요한 경우 일반적인 속임수는에 파일을 작성 /tmp하고 즉시 파일을 작성하는 unlink(2)것입니다. 이 시점에는 디렉토리에 파일이 없으므로 (종료하거나 충돌 할 때 정리할 것이 없습니다) 프로세스는 여전히 파일에 액세스 할 수 있으며 다른 프로세스는 실수로 또는 고의로 파일을 엉망으로 만들 수 없습니다. 그것은 관심있는 속성을 보여줍니다.
Norman Grey

이것은 프로그램이 파일을 사용하는 동안 열린 파일이 제거되고 정전이 발생하면 드라이브를 차지하는 공간에 스트랜드 된 데이터가 남아 있다는 것을 의미합니까? 파일을 사용하는 프로세스가 충돌하거나 종료되면 어떻습니까?
Jason C

1
@JasonC 귀하의 질문에 답변하기 위해 답변을 업데이트했습니다.
BillThor 2016 년

6

Matt Jenkins가 설명했듯이 OS (파일 시스템)는 응용 프로그램에서 열린 파일을 추적합니다. 프로세스가 파일을 열린 상태로 유지하는 한 데이터는 디스크에 남아 있습니다 (삭제되어 더 이상 다른 프로그램에서 볼 수 없거나 액세스 할 수없는 경우에도).

그 결과 파일을 사용하는 공간은 마지막 프로세스가 파일을 닫은 후에 만 ​​회수 할 수 있습니다. Linux / Unix 파일 시스템 작업에 대한 FAQ입니다. " 'df'명령은 파티션이 가득 찼으며 'du'는 여유 공간을보고합니다"(예 : http://batleth.sapienti-sat.org/projects/FAQs/ext3- 참조) faq.html ). 공간을 확보해야하는 경우 큰 파일 (예 : 로그 파일)을 삭제하는 것만으로는 충분하지 않습니다. 또한 프로세스가 파일을 열어 두지 않는지 확인해야합니다 (일반적으로 로그 파일 문제).


OS X / HFS +의 경우에 해당되지 않음 : 파일을 휴지통으로 이동시킬 수 있지만 파티션을 가로 질러 이동하거나 삭제할 수 없습니다 (예 : 휴지통 비우기).
Daniel Beck

2

실제로는 매우 간단합니다. 파일은 파일에 액세스하는 프로세스 인 참조 목록을 유지 관리합니다. 파일을 삭제하면 파일 자체가 아닌 디렉토리에서 목록이 제거됩니다. 여전히 파일이 열려있는 프로그램은 여전히 ​​파일에 액세스 할 수 있습니다. 파일은 액세스하는 모든 프로그램이 파일을 닫을 때만 실제로 삭제됩니다.

또한 파일을 이동하면 (동일한 파일 시스템 내에있는 경우) 파일이 실제로 이동하지 않고 파일이있는 디렉토리의 포인터 만 변경합니다.


"파일이 참조 목록을 유지합니까?"
Daniel Beck

파일이 아닌 "OS 또는 탐색기"여야합니다.
Moab

2
그것은 실제로 파일 시스템 일 것입니다.
JRobert

OS는 (파일 헤더 구조 nlinks)이 파일의 참조를 저장하는 파일 시스템을 사용 -이 - 우리 모두가 행복)
Majenko

1
"참조"는 파일에 대한 열린 핸들과 파일에 대한 하드 링크 (첫 번째 파일 이름 포함)가있는 프로세스입니다. 데이터 블록은 사용 가능으로 표시되지 않으며 참조 카운트가 0이 될 때까지 재사용 할 수 있습니다.
mpez0

0

유닉스 파일 시스템에서 파일은 하나 이상의 하드 링크 를 가질 수 있습니다 . 파일이 하나 이상있는 한 수명이 다합니다. 마지막 파일이 제거되면 파일 공간이 비워집니다. 위의 링크를 통해 더 많은 정보를 얻을 수 있습니다. 특히 "링크 카운터"섹션을 참조하십시오.


1
사실이지만 여기서 일어나고있는 것은 아닙니다. 요점은 마지막 하드 링크가 제거 된 후에도 모든 핸들이 핸들을 닫을 때까지 파일이 계속 유지된다는 것입니다.
sleske 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.