Tôi không phải là một chuyên gia về điều này, nhưng tôi đã đọc một chút để cố gắng hiểu những gì đang xảy ra.
Tôi sẽ nói "Sự nhầm lẫn phát sinh từ thực tế rằng:
- mối quan hệ giữa các khái niệm này là phức tạp và
- đã thay đổi theo thời gian và
- Apple đã triển khai cả API cấp độ chương trình và các công cụ như ls hoặc cp là một cách để che giấu nhiều sự khác biệt giữa các khái niệm. "
AIUI, tệp Danh mục HFS + chứa Bản ghi tệp Danh mục (trong số những thứ khác). Bản ghi tệp danh mục chứa các loại thông tin thông thường về tệp như ngày tạo, ngày truy cập, vv Bản ghi tệp danh mục cũng chứa hai cấu trúc cung cấp thông tin về vị trí và kích thước của ngã ba dữ liệu và của ngã ba tài nguyên.
AIUI, HFS + cũng đã (sao chép từ Wikipedia HFS +) một "Tệp thuộc tính [mà] là một cây B mới trong HFS Plus không có cấu trúc tương ứng trong HFS. Tệp thuộc tính có thể lưu trữ ba loại bản ghi 4 KB khác nhau: Bản ghi thuộc tính dữ liệu nội tuyến, bản ghi thuộc tính dữ liệu Fork và bản ghi thuộc tính mở rộng. Bản ghi thuộc tính dữ liệu nội tuyến lưu trữ các thuộc tính nhỏ có thể nằm trong bản ghi. Bản ghi thuộc tính dữ liệu của Fork chứa các tham chiếu đến tối đa tám phạm vi có thể chứa các thuộc tính lớn hơn. được sử dụng để mở rộng bản ghi thuộc tính dữ liệu Fork khi bản ghi tám phạm vi của nó đã được sử dụng. "
AIUI, dữ liệu được lưu trữ trong (hoặc được tham chiếu từ) Tệp thuộc tính (cho dù thuộc tính nội tuyến, dữ liệu nhánh hoặc thuộc tính mở rộng) được gọi là Thuộc tính mở rộng.
Đó là những cấu trúc dữ liệu, vậy chúng được sử dụng như thế nào?
AIUI, các phiên bản đầu tiên của hệ điều hành (có thể là các phiên bản trước 10,4 Tiger, mà John Siracusa dường như cho thấy có một số thay đổi lớn trong lĩnh vực này), đã chỉ ra ngã ba dữ liệu và ngã ba tài nguyên từ tệp Danh mục.
AIUI, khi chúng tôi nhận được 10,4 Tiger, Tệp thuộc tính sẽ được sử dụng rộng rãi để lưu trữ tất cả các loại dữ liệu.
Có thể (nhưng tôi không biết) rằng trong 10,4 và sau đó, bất kỳ Fork tài nguyên nào đều được trỏ đến từ tệp thuộc tính. Tức là trong câu trả lời cho câu hỏi đầu tiên của bạn, tôi sẽ nói các nhánh được đặt tên là Thuộc tính mở rộng, trừ khi chúng là Tài nguyên ngã ba và Ngã ba tài nguyên được tham chiếu từ tệp Danh mục.
Vấn đề trong việc biết cách triển khai mọi thứ là để duy trì khả năng tương thích ngược và đặc biệt là hỗ trợ truy cập vào các hệ thống tệp được viết bởi một phiên bản Mac OS từ phiên bản khác, những thứ khác nhau và hỗn hợp của mọi thứ cần được hỗ trợ một cách minh bạch.
Chúng ta không thể biết từ các công cụ dòng lệnh Terminal bình thường nơi dữ liệu thực sự được lưu giữ.
Vì vậy, quyền truy cập rsrc
có thể gợi ý rằng Resource Fork trong tệp Danh mục đang được truy cập.
$ ls -l Icon^M/rsrc
-rwxr-xr-x 1 root admin 486 23 Jul 2004 Icon?/rsrc
Tuy nhiên, chúng tôi biết rằng mặc dù cú pháp trông giống như một tệp bên dưới Icon^M
thư mục đang được truy cập, nhưng đây không thực sự là trường hợp, bởi vì
$ ls -lR Icon^M
-rwxr-xr-x@ 1 root admin 0 23 Jul 2004 Icon?
Vì vậy, Apple đã triển khai một trường hợp đặc biệt cho Tài nguyên Fork.
Nếu thay vào đó chúng ta làm
$ ls -l@
-rwxr-xr-x@ 1 root admin 0 23 Jul 2004 Icon?
com.apple.FinderInfo 32
com.apple.ResourceFork 486
Điều này cho thấy rằng chúng tôi đang truy cập Tệp thuộc tính. Nhưng một lần nữa, việc triển khai ls
có thể có một trường hợp đặc biệt cho Resource Fork.
John Siracusa chỉ ra ở đây rằng các danh sách ACL được lưu trữ như 'Thuộc tính mở rộng, nhưng đặc biệt đeo mặt nạ ra để họ không được hiển thị trong xattr
. Vì vậy, một lần nữa có xử lý trường hợp đặc biệt trong việc thực hiện xattr.
(Lưu ý rằng việc xử lý trường hợp đặc biệt này có thể nằm trong mã của công cụ hoặc trong mã của các API cơ bản mà công cụ truy cập.)
GregW, nếu bạn thấy điều này, sẽ rất tuyệt nếu có được ý kiến chuyên gia nhiều hơn về việc liệu tôi có đi đúng đường hay không, hay chỉ vô vọng bối rối.