어떻게 파일 크기가 0이 될 수 있나요?

어떻게 파일 크기가 0이 될 수 있나요?

내가 우연히 만났고 적절한 설명을 생각할 수 없었던 것입니다. 내 PC에 빈 *.txt 파일을 생성한 후 크기를 보면 0으로 표시됩니다. 그런데 그게 어떻게 가능할까요? 파일 자체가 비어 있더라도 자체 이름을 저장하려면 여전히 어느 정도 크기가 있어야 합니다. 이것을 어떻게 설명할 수 있나요? (OS에 따라 다름)

답변1

실제로 파일이 없기 때문에 가능한 일입니다. 이름과 소유자가 있는 디렉토리 항목만 있습니다. 디렉토리 항목은 파일과 논리적으로 구별됩니다. 예를 들어, 동일한 파일이 둘 이상의 디렉토리에 둘 이상의 이름을 가질 수 있습니다.

불행하게도 "파일"이라는 용어가 항상 정확히 같은 의미로 사용되는 것은 아닙니다. 그러나 파일 크기 논리는 디렉터리 항목이 파일을 디렉터리에 "첨부"하고 파일 이름과 관련 메타데이터가 디렉터리에 저장되는 모델에서 비롯됩니다.

답변2

"파일 크기"의 의미론적 의미는 사용 중인 의미와 다릅니다.

의미 있는 파일 크기는 다양합니다. 가장 일반적인 것, 그리고 여기에서 볼 수 있는 것은 "파일의 바이트 수"입니다. 파일이 빈 텍스트 파일인 경우 실제로는 0바이트를 포함할 수 있습니다. 파일을 열고 "모든 데이터를 읽고" 닫아야 하는 경우가 많기 때문에 이 숫자는 프로그래머에게 중요합니다. 미리 계획을 세울 수 있도록 파일에 몇 바이트의 데이터가 있는지 알아야 합니다.

또 다른 의미는 대부분의 파일 시스템이 데이터를 저장하는 방식에서 발생합니다. 대부분의 파일 시스템은 데이터를 블록에 저장합니다. 예를 들어, 파일 시스템은 64kB 블록에 데이터를 저장할 수 있습니다. 즉, 64kB의 짝수 배수가 아닌 것은 결코 할당하지 않는다는 의미입니다. 이는 비효율적으로 들리지만 장부를 훨씬 더 단순하게 만들 수 있으며, 단순하다는 것은 종종 더 빠르다는 것을 의미합니다.

세 번째 의미는 파일의 존재를 설명하기 위해 하드 드라이브에 필요한 실제 비트 수입니다. 여기에는 일반적으로 파일과 별도로 저장되는 정보가 포함됩니다. 예를 들어, Linux에서 "파일 이름"의 개념은 파일이 포함된 디렉토리의 inode에 저장됩니다(편집: 주석에서 보면 기술적으로 이는 디렉토리의 데이터에 저장됩니다. 이 글을 쓸 때 저는 작은 것을 생각하고 있었습니다. -디렉터리의 경우 156바이트보다 작은 데이터는 inode에 직접 저장할 수 있습니다. 이는 일반적으로 사용되는 의미가 아닙니다. 파일 시스템의 엄청나게 깊은 내부 작동을 알지 못하면 결정하기가 매우 어렵기 때문입니다(파일에 대한 모든 권한을 저장하는 데 필요한 공간을 고려했습니까?). 그러나 1,000,000바이트 하드 드라이브가 있고 해당 하드 드라이브에 맞는 파일의 크기를 알고 싶다면 이는 매우 중요한 의미가 될 것입니다!

답변3

파일 이름은 다른 곳에 저장되어 있습니다.

디스크에는 "파일 시스템"이 있으며, 물리적 디스크에서 파일 이름과 파일이 표시되고 해석되는 방법을 선택하는 방법을 간단히 설명합니다.

대부분의 Windows 디스크에서는 "NTFS"(신기술 파일 시스템)라는 파일 시스템을 사용하게 되며, 이는 파일 내용과 별도로 MFT(마스터 파일 테이블)에 파일 이름 정보를 저장합니다.마스터 파일 테이블에 관한 Wikipedia 기사.

따라서 파일 자체의 길이는 0바이트가 되지만 MFT의 해당 항목은 여전히 ​​일부 공간을 차지합니다.

답변4

(답변이 좀 늦었습니다...)

파일 크기가 0이 될 수 있는 방법은 위 답변에서 제공하는 것보다 조금 더 복잡합니다. 질문에는 Win7이라는 태그가 지정되어 있지만 다음과 같은 다른 "간단한" 파일 시스템을 살펴보겠습니다.지방또는NTFS, 개념이 유사하므로 유용할 수 있습니다.

디스크는 파일이 무엇인지, 디렉토리가 무엇인지 "알지" 못합니다. 그것은 작은 블록의 모든 데이터입니다. OS는 데이터 블록의 의미를 구별합니다. 처음 몇 개는 특별하지만 나머지 블록은 데이터에 대한 정보(예: 파일 이름, 파일 길이, 데이터를 보유하는 첫 번째 데이터 블록) 또는 데이터 자체를 보유합니다.

디렉토리는 OS가 이해하는 "데이터"가 파일 내용이 아닌 파일에 대한 정보를 포함하는 정보 블록인 특수 "파일"입니다. 좋은 비유는 물리적 도서관과 카드 카탈로그입니다. 정보 블록을 카드 카탈로그로, 선반을 데이터 블록으로 생각하십시오(카드 카탈로그도 선반형 구조에 위치함).

파일을 "생성"하면(예: UNIX touch명령 사용) OS는 먼저 다음을 사용하여 정보 블록(디렉토리)에 항목을 생성합니다.

  • 이름 = My_File.txt
  • 길이 = 0
  • 시작 데이터 블록 = N/A
  • 추가 정보(소유자, 권한, 생성/업데이트/수정 날짜) 등

"쓸" 데이터가 있는 경우에만 데이터를 저장할 빈 데이터 블록을 찾으려고 시도합니다. 그러나 데이터 블록은 디스크가 접근하고 OS가 읽기에 편리한 고정된 크기(예: 32K)로 제공됩니다. "Hello"만 쓴다면 대부분의 블록은 "비어 있습니다"(실제로는 0이 아닐 수도 있지만 이전에 있었던 것의 쓰레기임). 따라서 테이블도 이제 크기를 길이(예: 5자 + 끝)로 업데이트합니다. 파일) 나쁜 내용을 얻지 않도록하십시오.

"파일"을 길이 > 블록 크기로 업데이트하면 OS는 데이터를 새 블록에 쓰고 데이터 블록을 업데이트하여 파일이 첫 번째 블록 이후에 다음 블록으로 계속되고 길이가 업데이트된다는 것을 나타냅니다. 새로운 길이(세부 사항은 다름)

결국에는 데이터 블록 체인(파일 콘텐츠)에 대한 정보가 포함된 정보 데이터 블록(디렉터리 또는 목록) 모음이 됩니다.

논리적으로 이는 동일한 파일 시스템에서 파일 이동이 빠르게 깜박이는 반면 복사에는 오랜 시간이 걸리는 이유도 설명합니다. OS는 한 디렉토리(정보 데이터 블록)에서 항목을 제거하고 다른 디렉토리에 추가하기 위해 2개의 디렉토리 블록만 편집하면 됩니다. 파일 삭제: 디렉토리 블록의 항목을 제거하여 재할당할 파일 데이터 블록을 확보합니다.

추신: 카드 카탈로그에 책에 대한 항목이 있다고 해서 해당 책이 선반에 있다는 의미는 아닙니다(체크아웃되었거나 분실되었을 수 있음). 파일 크기 0.

pps: 도서관 안에 잘못 놓인 책은 도서관 검색을 의미합니다. 컴퓨터 용어로는 chkdsk 또는 복구 디스크를 의미합니다!

UNIX inode에 대해 읽거나 버전 제어 시스템(ClearCase, TFS, Git 등)이 파일과 디렉터리뿐만 아니라 파일 버전, 심지어 디렉터리 버전도 관리하는 방법을 이해하면 더 큰 이해를 얻을 수 있습니다. 대부분의 경우 모든 것은 데이터베이스에 저장되어 사용자에게 고전적인 디렉터리 구조와 파일로 표시됩니다!

관련 정보