Làm thế nào một kích thước tập tin có thể bằng không?


173

Chỉ cần một cái gì đó tôi chạy vào và không thể nghĩ ra một lời giải thích thích hợp. Nếu tôi tạo một tệp * .txt trống trên PC của mình và sau đó nhìn vào kích thước của nó, nó hiển thị 0. Nhưng làm thế nào là có thể? Ý tôi là ngay cả khi tập tin trống, nó vẫn phải có kích thước nào đó, chỉ để lưu tên riêng của nó. Việc này được giải thích như thế nào? (Không phải hệ điều hành cụ thể)


81
tên tệp không được tính trong tệp, làm thế nào nó có thể được giải thích.
njzk2

123
Tôi nhớ về một người bạn ở trường đại học, người đã viết một phần mềm để lưu trữ văn bản dưới dạng tên tệp để vượt qua hạn ngạch đĩa.
slebetman

15
@ColeJohnson Tôi là một thực tập sinh trở lại vào những năm 2000 tại một trong những phòng thí nghiệm máy tính của tôi và hạn ngạch người dùng được tính là tổng số các tệp. Vì vậy, lưu trữ dữ liệu dưới dạng tên tệp thực sự sẽ có được xung quanh qouta. Heck bạn có thể lưu một chương trình trong các thư mục và nó sẽ không được tính vào hạn ngạch của bạn.
Mindwin

20
@slebetman Đây là điểm mà ranh giới giữa thiên tài và sự điên rồ trở nên mờ nhạt.
Pharap

10
Một kỹ thuật tương tự đã được sử dụng nổi tiếng trong một thử thách nén ,
Oddthinking

Câu trả lời:


202

Điều đó là có thể bởi vì thực sự không có tập tin nào. Chỉ có một mục thư mục với một tên và chủ sở hữu. Mục nhập thư mục là khác biệt hợp lý từ các tập tin. Ví dụ: cùng một tệp có thể có nhiều hơn một tên trong nhiều thư mục.

Thật không may, thuật ngữ "tập tin" không phải lúc nào cũng được sử dụng để có nghĩa chính xác cùng một điều. Nhưng logic kích thước tệp xuất phát từ mô hình trong đó mục nhập thư mục "đính kèm" tệp vào thư mục và tên tệp và siêu dữ liệu liên quan được lưu trữ trong thư mục.


30
... còn được gọi là Liên kết cứng.
Daniel B

6
Trong thư mục. Mặt khác, nếu cùng một tệp nằm trong hai thư mục và bạn đổi tên nó thành một, điều đó sẽ sửa đổi thư mục khác, điều này sẽ không có ý nghĩa gì cả. Ngoài ra, không phải theo cách này, nội dung của một thư mục sẽ là gì?!
David Schwartz

14
Trên hầu hết các hệ điều hành giống như UNIX, như FreeBSD và Linux, bạn có thể dễ dàng lấy kích thước của một thư mục. Các lệnh như ls -ld <directory>sẽ làm việc.
David Schwartz

11
Tôi không biết điều này có đúng với phiên bản NTFS hiện tại không, nhưng các phiên bản đầu tiên (ví dụ: trên NT3.x) sẽ lưu trữ dữ liệu cho các tệp rất nhỏ trong mục nhập thư mục. Các tập tin theo nghĩa đen sẽ không tồn tại.
John Rennie

13
Điều đó không hoàn toàn đúng khi không có tệp, trừ khi NTFS rất khác với các hệ thống tệp khác. Trên một hệ thống tập tin Unix bình thường, sẽ có một nút lưu trữ các quyền, thời gian sửa đổi, v.v. Mục nhập thư mục vẫn đề cập đến inode này. Sự khác biệt duy nhất giữa một tệp trống và một tệp không trống là con trỏ để phân bổ các khối. Tuy nhiên, một tệp trống có hệ thống tệp tương đương với một con trỏ NULL cho sơ đồ khối của nó, để chỉ ra rằng nó không có bất kỳ khối dữ liệu nào. Các mục trong thư mục không bị lộn xộn với các quyền và thời gian mod, ngay cả đối với các tệp trống. ví dụ: các nút XFS là 256B
Peter Cordes

82

Ý nghĩa ngữ nghĩa của "kích thước tệp" khác với nghĩa bạn đang sử dụng.

Có nhiều kích cỡ tập tin có ý nghĩa. Cái phổ biến nhất và cái bạn đang thấy ở đây là "số byte trong tệp." Nếu tệp là một tệp văn bản trống, nó thực sự có thể chứa 0 byte. Con số này rất quan trọng đối với các lập trình viên bởi vì chúng ta thường cần mở một tệp, "đọc tất cả dữ liệu" và đóng nó. Chúng ta cần biết có bao nhiêu byte dữ liệu trong tệp để chúng ta có thể lên kế hoạch trước.

Một ý nghĩa khác phát sinh từ cách hầu hết các hệ thống tập tin lưu trữ dữ liệu. Hầu hết các hệ thống tập tin lưu trữ dữ liệu trong các khối. Ví dụ: hệ thống tệp có thể lưu trữ dữ liệu trong các khối 64kB, có nghĩa là nó sẽ không bao giờ phân bổ bất cứ thứ gì không phải là bội số của 64kB. Điều này nghe có vẻ không hiệu quả, nhưng nó có thể làm cho việc ghi sổ đơn giản hơn rất nhiều và thường đơn giản hơn có nghĩa là nhanh hơn.

Một ý nghĩa thứ ba, mà bạn đang theo dõi, sẽ là số bit thực tế cần thiết trên ổ cứng để mô tả sự hiện diện của một tệp. Điều này bao gồm thông tin thường được lưu trữ riêng biệt từ tệp. Chẳng hạn, trong Linux, khái niệm "tên tệp" được lưu trong inode cho thư mục chứa tệp (chỉnh sửa: từ các bình luận, về mặt kỹ thuật, điều này được lưu trữ trong dữ liệu của thư mục. Khi tôi viết điều này, tôi đã nghĩ đến việc nhỏ -directory case. Dữ liệu nhỏ hơn 156 byte có thể được lưu trữ trực tiếp trong inode). Đây không phải là một ý nghĩa thường được sử dụng, bởi vì rất khó để xác định mà không biết hoạt động bên trong cực kỳ sâu của hệ thống tệp của bạn (bạn có chiếm không gian cần thiết để lưu trữ tất cả các quyền trên tệp không?). Tuy nhiên, nếu bạn có ổ cứng 1.000.000 byte,


2
"trong inode cho thư mục chứa tệp" Ý bạn là dữ liệu của thư mục chứ không phải là inode của nó? Nút in chứa kích thước tệp và ngày, nhưng không có tên ...
Medinoc

@Medinoc Điểm tốt. Tôi đã nghĩ đến trường hợp nội tuyến khi nó lưu trữ dữ liệu trong inode, nhưng tôi không thực sự kiểm tra xem điều này có thể xảy ra bao nhiêu! Tôi đã thêm một chỉnh sửa.
Cort Ammon

Tính năng dữ liệu nội tuyến liên quan của ext4, điều này không có nghĩa là phổ biến trên tất cả các hệ thống tập tin. Ngoài ra, điều này áp dụng cho các tập tin inode, không phải thư mục. Chúng là riêng biệt, các thư mục cũng có khả năng dữ liệu nội tuyến, nhưng chúng là các tính năng riêng biệt. Một tệp inode có kích thước được đặt, ít nhất là trong trường hợp của ext4, vì vậy việc sử dụng dữ liệu của các quyền là không liên quan. Việc sử dụng đĩa tập tin phụ thuộc rất nhiều vào hệ thống tập tin đang sử dụng, phần thứ ba của câu trả lời này chỉ áp dụng cho ext4 theo như tôi có thể nói, điều này không được làm rõ.
Phizes

8
Nếu bạn có ổ cứng 1.000.000 byte, có lẽ đã đến lúc bắt đầu suy nghĩ về việc nâng cấp.
nekomatic

53

Tên tập tin được lưu trữ ở một nơi khác.

Đĩa của bạn sẽ có một "hệ thống tệp" trên đó, chỉ cần đặt một phương thức để chọn cách tên và tệp được trình bày và diễn giải trên đĩa vật lý.

Trên hầu hết các đĩa Windows, bạn sẽ sử dụng một hệ thống tệp có tên "NTFS" (Hệ thống tệp công nghệ mới "), điều này lưu trữ thông tin tên tệp trong Bảng tệp chính (MFT) tách biệt với nội dung tệp. Xem bài viết Wikipedia trên Bảng tệp chính .

Do đó, chính tệp sẽ có độ dài 0 byte, nhưng mục nhập của nó trong MFT vẫn sẽ chiếm một số không gian.


11
và trong trường hợp NTFS, kích thước tệp được Windows báo cáo và hầu hết các công cụ thực sự là kích thước của luồng chính của tệp mà chúng tôi coi là nội dung của tệp. Tệp được lưu trữ trên phân vùng NTFS có thể có một số dữ liệu được lưu trữ trong các luồng dữ liệu thay thế và vẫn có kích thước được báo cáo là 0 . Đây là một tính năng hệ thống tập tin tuyệt vời để biết nếu bạn muốn có hình ảnh đầy đủ :)
Paweł Bulwan

12

Đây là một câu hỏi bản thể học khá thú vị ...

Các tập tin chính là nội dung của tập tin. Nếu tệp không có nội dung, nó có kích thước bằng không. Tên tệp là một phần của tệp vì tên riêng của bạn thực sự là một phần của bạn (nghĩa là không phải vậy).

Giống như tên của bạn tồn tại như một ý tưởng trong đầu mọi người (và của chính bạn) đề cập đến / trỏ đến vật lý của bạn, tên tệp tồn tại trong cây thư mục của hệ thống tệp và nó đề cập / trỏ đến tệp.


7

(Một chút muộn để trả lời ...)

Làm thế nào một tập tin có thể có kích thước bằng 0 phức tạp hơn một chút so với các câu trả lời ở trên. Câu hỏi được gắn thẻ Win7, nhưng nhìn vào các hệ thống tệp "đơn giản" khác như FAT hoặc NTFS , có thể hữu ích vì các khái niệm tương tự nhau.

Đĩa không "biết" tập tin là gì và thư mục là gì; đó là tất cả dữ liệu trong các khối nhỏ. HĐH phân biệt giữa ý nghĩa của các khối dữ liệu. Một số đầu tiên đặc biệt, nhưng các khối còn lại chứa thông tin về dữ liệu (ví dụ: tên tệp, độ dài tệp, khối dữ liệu đầu tiên giữ dữ liệu) hoặc chính dữ liệu.

Thư mục là một "tệp" đặc biệt có "dữ liệu" mà HĐH hiểu là khối thông tin chứa thông tin về tệp chứ không phải nội dung của tệp. Một tương tự tốt là một thư viện vật lý và danh mục thẻ. Hãy nghĩ về các khối thông tin là danh mục thẻ và các kệ như các khối dữ liệu (danh mục thẻ cũng nằm trên một cấu trúc giống như kệ).

Khi bạn "tạo" một tệp (nói bằng touchlệnh UNIX ), trước tiên HĐH sẽ tạo một mục trong một khối thông tin (thư mục), với thông tin sau:

  • Tên = My_File.txt
  • Độ dài = 0
  • Khối dữ liệu bắt đầu = Không áp dụng
  • Thông tin bổ sung (chủ sở hữu, quyền, ngày tạo / cập nhật / sửa đổi), v.v.

Chỉ khi có một số dữ liệu để "ghi" thì nó mới cố gắng tìm một khối dữ liệu trống để lưu trữ dữ liệu. Nhưng các khối dữ liệu có kích thước cố định (giả sử là 32K) để đĩa có thể đến và hệ điều hành để đọc. Nếu bạn chỉ viết "Xin chào", hầu hết các khối là "trống" (thực tế có thể không phải là số không, nhưng rác từ những gì đã có trước đó), do đó, bảng cũng cập nhật kích thước theo chiều dài (giả sử 5 ký tự + Kết thúc Tập tin) để bạn không nhận được những thứ xấu.

Khi bạn cập nhật "tệp" thành kích thước khối> chiều dài, HĐH sẽ ghi dữ liệu vào khối mới và cập nhật khối dữ liệu để nói rằng tệp tiếp tục vào khối tiếp theo SAU lần đầu tiên (v.v.) và độ dài được cập nhật chiều dài mới (chi tiết khác nhau).

Những gì bạn kết thúc là một tập hợp các khối dữ liệu thông tin (thư mục hoặc danh sách) với thông tin về chuỗi khối dữ liệu (nội dung tệp).

Về mặt logic, điều này cũng giải thích tại sao một tệp di chuyển trên cùng một hệ thống tệp đang nhấp nháy nhanh trong khi một bản sao mất nhiều thời gian. HĐH chỉ phải chỉnh sửa 2 khối thư mục để xóa mục nhập khỏi một thư mục (khối dữ liệu thông tin) và thêm vào một thư mục khác. Xóa một tệp: chỉ cần xóa mục trong khối thư mục, giải phóng các khối dữ liệu tệp sẽ được phân bổ lại.

ps: Chỉ vì danh mục thẻ có mục cho một cuốn sách không có nghĩa là nó ở trên kệ (có thể đã được kiểm tra hoặc bị mất); kích thước tệp 0.

pps: Một cuốn sách bị thất lạc trong thư viện ngụ ý thư viện tìm kiếm, hoặc trong thuật ngữ máy tính: chkdsk hoặc đĩa sửa chữa!

Một sự hiểu biết lớn hơn có thể được lượm lặt bằng cách đọc về các nút UNIX hoặc đánh giá cao cách các hệ thống kiểm soát phiên bản (ClearCase, TFS, Git, v.v.) quản lý không chỉ các tệp và thư mục, mà cả các phiên bản của tệp và thậm chí các phiên bản của thư mục. Trong hầu hết các trường hợp, mọi thứ được lưu trữ trong cơ sở dữ liệu và được trình bày cho người dùng để xuất hiện dưới dạng tệp và cấu trúc thư mục cổ điển!


4

Chúng tôi có một số câu trả lời tuyệt vời ở đây - Tôi chỉ cần thêm phiên bản hình ảnh (một ngàn từ và tất cả những thứ đó.)

Đây là một trong những ổ đĩa cứng có định dạng NTFS của tôi trông như thế nào nếu bạn hình dung nó bằng một công cụ chống phân mảnh đĩa. Các MFT (Master File Table) được thể hiện trong màu tím:

nhập mô tả hình ảnh ở đây

Hình vuông nhỏ màu tím đó mô tả danh sách các tập tin có trong HD của tôi. Nói một cách dễ hiểu, đối với một đĩa NTFS, Mục lục dành cho một cuốn sách là gì; thay vì các trang, nó trỏ đến vị trí vật lý của chúng trên phần còn lại của đĩa 1 .

Một tệp có kích thước byte bằng 0 có thể được hiển thị dưới dạng mục Mục lục chỉ đến không có trang nào cả:

nhập mô tả hình ảnh ở đây

Mục nhập ở đó, được liệt kê - nhưng vì không có trang nào được chỉ định, chúng tôi có thể cho rằng nội dung là không tồn tại.

1 - Chắc chắn, nó phức tạp hơn thế một chút; nhưng các điểm như bản đồ khu vực, MFT gương, v.v ... nằm ngoài phạm vi của câu hỏi này.


3

Hệ thống tệp lưu trữ nhiều thông tin về một tệp như tên tệp, kích thước tệp, thời gian tạo, thời gian truy cập, thời gian sửa đổi, quyền của người dùng, người dùng và nhóm, đoạn, con trỏ tới cụm lưu trữ tệp, liên kết cứng / mềm, thuộc tính ... Chúng được gọi là siêu dữ liệu tệp . Tại sao bạn tính các siêu dữ liệu đó vào kích thước tệp khi người dùng không (cần) quan tâm đến chúng và không biết về chúng? Họ chỉ thực sự quan tâm đến nội dung tập tin

Ngoài ra, mỗi hệ thống tệp lưu trữ các loại siêu dữ liệu khác nhau chiếm dung lượng khác nhau trên đĩa. Ví dụ, quyền POSIX rất khác với quyền NTFS và cũng có những inodesố trong POSIX không tồn tại trên Windows. Ngay cả các hệ thống tệp POSIX cũng thay đổi rất nhiều, như ext3 với địa chỉ khối 32 bit, ext4 với 48 bit, Btrfs với 64 bit và ZFS với địa chỉ 128 bit. Vậy làm thế nào bạn sẽ đếm những siêu dữ liệu đó vào kích thước tệp?

Lấy một ví dụ khác với tệp 100 byte có siêu dữ liệu tiêu thụ 56 byte trên hệ thống tệp hiện tại. Chúng tôi sao chép tệp vào hệ thống tệp khác và bây giờ phải mất 128 byte siêu dữ liệu. Tuy nhiên, nội dung tệp hoàn toàn giống nhau , số byte trong các tệp cũng giống nhau. Vì vậy, hiển thị kích thước tệp là 156 byte trên một hệ thống nhưng 228 byte trên một hệ thống khác là rất khó hiểu và phản trực giác .


1

Một kích thước tập tin của 0, tương tự như nói: Tôi có một tờ giấy có 5chữ. Và trên một tờ giấy khác, nó có 0dòng chữ trên đó. Như vậy 0là hoàn toàn có thể.

Dữ liệu meta của tệp (thời gian ngày tạo, thời gian ngày sửa đổi lần cuối, chủ sở hữu tệp, quyền), tất cả đều được lưu trữ ở nơi khác và không được bao gồm như một phần của kích thước tệp.


0

Hiểu nó một cách đơn giản ... khi bạn tạo một tệp .. có một mục nhập thư mục được tạo ra hoạt động như một con trỏ cho vị trí bộ nhớ của tệp được xác định bởi tên tệp bạn cung cấp. Kích thước của thư mục tăng lên khi bạn tạo ngày càng nhiều con trỏ hoặc nói các tệp .. trong khi kích thước tệp sẽ chỉ tăng nếu bạn đặt dữ liệu ssome tại vị trí nhọn tức là bên trong tệp. Cho đến khi kích thước sẽ bằng không. :)


Đây thực sự là một bình luận, không phải là một câu trả lời, và chỉ lặp lại những gì người khác đã nói.
JakeGould

0

Vì vậy, đây là cách nó hoạt động:

Ngay khi bạn tạo bất kỳ tệp nào trên một ổ đĩa, nó sẽ tạo một bản ghi tệp trong tệp mata NTFS, tức là $ MFT (bảng tệp chính). Vì có một FRS (Phân đoạn bản ghi tệp) có trong MFT, bạn sẽ thấy một bản ghi. Mỗi bản ghi tệp có kích thước 1 KB theo mặc định trong trường hợp NTFS FileSystem. Nhưng không gian đó chỉ được yêu cầu nếu bạn lưu trữ một số thông tin bên trong tệp. Mặc dù bạn chỉ viết một chữ cái "a" xem xét rằng đó là tệp văn bản, nó sẽ yêu cầu 1 KB dung lượng vì đó là kích thước mặc định của FRS. Chữ "a" chuyển đến luồng dữ liệu mặc định và chưa được đặt tên của FRS đó, $ Data là thuộc tính mà tất cả dữ liệu của bạn sẽ đi nếu bạn không có ADS (Luồng dữ liệu thay thế).

Hãy cho tôi biết nếu bạn đưa ra bất kỳ câu hỏi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.