Câu hỏi Kích thước tệp có thể bằng 0 như thế nào?


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 tin * .txt trống trên máy tính của tôi và sau đó nhìn vào kích thước của nó, nó cho thấy 0. Nhưng làm thế nào là có thể? Ý tôi là ngay cả khi bản thân tệp đó trống, nó vẫn phải có một số kích thước, chỉ để lưu trữ 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ể)


173
2017-09-15 08:32


gốc


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
Tôi được nhắc 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 để đi quanh hạn ngạch đĩa. - slebetman
@ColeJohnson Tôi là một thực tập sinh trở lại vào 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 của người dùng được tính toán như là tổng của các tập tin. Vì vậy, lưu trữ dữ liệu như tên tập tin thực sự sẽ nhận được xung quanh qouta. Heck bạn có thể lưu một chương trình trong thư mục và nó sẽ không được tính vào hạn ngạch của bạn. - Mindwin
@slebetman Đây là điểm mà ranh giới giữa thiên tài và chứng điên cuồng trở nên mờ nhạt. - Pharap
Một kỹ thuật tương tự đã được sử dụng một cách nổi tiếng trong một thử thách nén, - Oddthinking


Các câu trả lời:


Có thể vì không có tệp nào. Chỉ có một mục nhập thư mục có tên và chủ sở hữu. Mục nhập thư mục khác biệt về mặt logic với tệp. Ví dụ: cùng một tệp có thể có nhiều hơn một tên trong nhiều hơn một thư mục.

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


201
2017-09-15 08:34



... còn được gọi là Liên kết cứng. - Daniel B
Trong thư mục. Nếu không, 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 thư mục, đ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, nó không theo cách này, nội dung của một thư mục là gì? - David Schwartz
Trên hầu hết các hệ điều hành giống UNIX, như FreeBSD và Linux, bạn có thể dễ dàng nhận được 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
Tôi không biết điều này có đúng với phiên bản NTFS hiện tại hay 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
Không hoàn toàn đúng là không có tệp nào, 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 inode lưu trữ các quyền, mod-lần, và như vậy. 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 rỗng và một tệp không trống là con trỏ để phân bổ các khối. Một tập tin trống có hệ thống tập tin tương đương với một con trỏ NULL cho bản đồ khối của nó, tuy nhiên, để chỉ ra rằng nó không có bất kỳ khối dữ liệu nào. Mục nhập thư mục không lộn xộn với quyền và thời gian sửa đổi, ngay cả đối với tệp trống. ví dụ: XFS inodes là 256B - Peter Cordes


Ý 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 thước tệp có ý nghĩa. Một trong những phổ biến nhất, và một trong những bạn đang thấy ở đây, là "số byte trong tập tin." Nếu tệp là một tệp văn bản trống, nó 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 vì chúng ta thường cần phải mở một tệp, "đọc tất cả dữ liệu" và đóng nó lại. Chúng ta cần biết có bao nhiêu byte dữ liệu sẽ có trong tệp để chúng tôi có thể lập kế hoạch trước.

Một ý nghĩa khác nảy sinh từ cách mà 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 tin có thể lưu trữ dữ liệu trong 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 sổ sách kế toán khá đơn giản hơn 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 tugging tại, sẽ là số bit thực tế cần thiết trên đĩa cứng để mô tả sự hiện diện của một tập tin. Điều này bao gồm thông tin thường được lưu trữ riêng biệt với tệp. Ví dụ, trong Linux, khái niệm "tên tệp" được lưu trữ trong inode cho thư mục chứa tệp (chỉnh sửa: từ nhận xét, về mặt kỹ thuật này được lưu trữ trong dữ liệu của thư mục. Khi tôi viết bài này, tôi đã nghĩ về - Trường hợp thư mục. 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ì nó là khó khăn để xác định mà không biết hoạt động bên trong sâu sắc của hệ thống tập tin của bạn (bạn có tài khoản cho không gian cần thiết để lưu trữ tất cả các điều khoản trên tập tin?). Tuy nhiên, nếu bạn có ổ cứng 1.000.000 byte và muốn biết mức độ lớn của một tệp phù hợp với ổ cứng đó thì đây sẽ là một ý nghĩa rất quan trọng đối với bạn!


82
2017-09-15 17:41



"trong inode cho thư mục chứa tệp" Bạn không có nghĩa là dữ liệu của thư mục, chứ không phải là inode của nó? Các inode chứa kích thước tập tin và ngày tháng, nhưng không có tên ... - Medinoc
@ Medinoc Điểm tốt. Tôi đã suy nghĩ của trường hợp nội tuyến khi nó được lưu trữ dữ liệu trong inode, nhưng tôi đã không thực sự kiểm tra để xem có bao nhiêu điều này có thể xảy ra! Tôi đã thêm bản chỉnh sửa. - Cort Ammon
Liên quan tính năng dữ liệu nội dòng của ext4, điều này là do không có nghĩa là phổ quát 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 inode, không áp dụng cho thư mục. Họ là riêng biệt, thư mục cũng có một khả năng dữ liệu nội tuyến, nhưng họ là những 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, do đó 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 phụ thuộc nhiều vào hệ thống tệp đang được 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
Nếu bạn có ổ cứng 1.000.000 byte thì có thể đã đến lúc bắt đầu suy nghĩ về việc nâng cấp. - nekomatic


Tên tệp được lưu ở một nơi khác.

Đĩa của bạn sẽ có một "hệ thống tập tin" trên nó, chỉ đơn giản là một phương pháp để chọn cách tên tập tin và các tập tin đượ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 hệ thống tệp có tên "NTFS" (Hệ thống tệp công nghệ mới), 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. Bài viết trên Wikipedia về Bảng tệp chính.

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


53
2017-09-15 21:58



và trong trường hợp NTFS, kích thước tệp được báo cáo bởi Windows và hầu hết các công cụ thực sự là kích thước của dò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ể bổ sung một số dữ liệu được lưu trữ trong luồng dữ liệu thay thếvà vẫn có kích thước được báo cáo là 0. Đó là một tính năng hệ thống tập tin tốt đẹp để biết nếu bạn muốn có hình ảnh đầy đủ :) - Paweł Bulwan


Đây là một câu hỏi ontology khá thú vị ...

Bản thân tệp là nội dung của tệp. Nếu tệp không có nội dung, tệp có kích thước bằng 0. Tên tập tin là một phần của tập tin như tên của bạn là thể chất là một phần của bạn (ví dụ, nó không phải là).

Cũng giống như tên của bạn tồn tại như một ý tưởng trong đầu của mọi người (và của riêng bạn) đề cập / điểm đến vật lý 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 / điểm vào tệp.


12
2017-09-16 14:59





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

Làm thế nào một tập tin có kích thước bằng không là 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ư MẬP hoặc là NTFS, có thể hữu ích vì các khái niệm tương tự nhau.

Đĩa không "biết" tệp là gì và thư mục là gì; đó là tất cả dữ liệu trong các khối nhỏ. Hệ điều hành phân biệt giữa ý nghĩa của các khối dữ liệu. Một số đặc biệt đầu tiên, nhưng phần còn lại của các khố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 dữ liệu.

Thư mục là một "tệp" đặc biệt có "dữ liệu" mà hệ điều hành hiểu là một 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 sự tương tự tốt là một thư viện vật lý và danh mục thẻ. Hãy suy nghĩ của các khối thông tin như 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 tin (nói với UNIX touch lệnh), hệ điều hành đầu tiên tạo một mục nhập trong một khối thông tin (thư mục), với những điều sau đây:

  • Tên = My_File.txt
  • Độ dài = 0
  • Bắt đầu khối dữ liệu = N / A
  • 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" hiện nó 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 (nói 32K) thuận tiện cho đĩa để đến và hệ điều hành để đọc. Nếu bạn chỉ viết "Hello", phần lớn khối là "trống" (thực ra có thể không phải là 0, nhưng rác từ những gì đã có trước đó), vì vậy bảng bây giờ cũng cập nhật kích thước thành độ dài (nói 5 ký tự + Kết thúc Tập tin), do đó bạn không nhận được những thứ xấu.

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

Những gì bạn kết thúc với 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 các khối dữ liệu (nội dung tập tin).

Một cách hợp lý, điều này cũng giải thích tại sao một tập tin di chuyển trên cùng một hệ thống tập tin nhấp nháy nhanh trong khi một bản sao mất một thời gian dài. Hệ điều hành 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 tệp: chỉ cần xóa mục nhập trong khối thư mục, giải phóng các khối dữ liệu tệp được phân bổ lại.

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

pps: Một cuốn sách không đúng chỗ bên 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 inode UNIX hoặc đánh giá cao cách các hệ thống điều khiển phiên bản (ClearCase, TFS, Git, vv) quản lý không chỉ các tệp và thư mục mà còn quản lý các phiên bản của tệp và thậm chí cả 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à trình bày cho người dùng xuất hiện dưới dạng cấu trúc thư mục cổ điển và các tệp!


7
2017-09-16 09:55





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

Đây là một trong những ổ đĩa cứng đị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 (Bảng tệp chính) được thể hiện bằng màu tím:

enter image description here

Hình vuông nhỏ màu tím đó mô tả danh sách các tệp có trong HD của tôi. Nói một cách thô ráp, đối với một đĩa NTFS, mục lục là gì đối với một cuốn sách; thay vì các trang, nó trỏ đến vị trí thực của chúng trên phần còn lại của đĩa1.

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

enter image description here

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

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


4
2017-09-24 00:05





Cửa hàng hệ thống tập tin rất 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, người dùng được tạo, quyền người dùng và nhóm, phân đoạn, con trỏ tới các 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 siêu dữ liệu đó vào kích thước tệp khi người dùng không cần phải quan tâm đến họ và không biết về chúng? Họ chỉ thực sự quan tâm đến nội dung tệp

hơn thế nữa mỗi hệ thống tệp lưu trữ các loại siêu dữ liệu khác nhau có lượng không gian khác nhau trên đĩa. Ví dụ cho phép POSIX rất khác với quyền NTFS, và cũng có inode số trong POSIX không tồn tại trên Windows. Ngay cả các hệ thống tệp POSIX khác nhau 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ì 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 tin?

Lấy một ví dụ khác với một 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 tin vào hệ thống tập tin 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 chính xác giống nhau, số byte trong các tập tin 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.


3
2017-09-16 09:41





Kích thước tệp của 0, tương tự như nói: Tôi có một bài báo với 5 các từ trên đó. Và trên một bài báo khác, nó có 0 các từ trên đó. Vì thế 0 là hoàn toàn có thể.

Dữ liệu meta của tệp (thời gian ngày tạo, ngày giờ sửa đổi lần cuối, chủ sở hữu tệp, quyền), tất cả đượ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.


1
2017-12-25 04:37





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 nhiều hơn và nhiều con trỏ hơn 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 ở vị trí đã xác định, tức là bên trong tệp. Đến khi đó kích thước sẽ bằng không. :)


0
2017-09-16 18:55



Đâ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


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

Ngay sau khi bạn tạo bất kỳ tệp nào trên ổ đĩ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 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 Hệ thống tệp NTFS. Nhưng không gian đó chỉ được xác nhận 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" cho rằng đó là một tệp văn bản, nó sẽ yêu cầu 1 KB không gian vì đó là kích thước mặc định của FRS. Chữ "a" đi đến dòng dữ liệu mặc định và chưa được đặt tên của FRS đó, $ Dữ liệu là thuộc tính mà tất cả dữ liệu của bạn đi nếu bạn không có ADS (Dò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 nào.


0
2017-09-23 17:19