2008-10-09 30 views

Trả lời

7

Như trong các Unix khác, đó là tính năng của hệ thống tệp. Hoặc là hệ thống tập tin hỗ trợ nó cho TẤT CẢ các tập tin hoặc nó không. Không giống như Win32, bạn không phải làm bất cứ điều gì đặc biệt để làm cho nó xảy ra. Cũng không giống như Win32, không có hình phạt hiệu suất cho việc sử dụng một tập tin thưa thớt.

Trên hệ điều hành MacOS, hệ thống tệp mặc định là HFS +, không không hỗ trợ tệp thưa thớt.

Cập nhật: MacOS được sử dụng để hỗ trợ khối lượng UFS với hỗ trợ tệp thưa thớt, nhưng đã bị xóa. Không có hệ thống tệp hiện được hỗ trợ nào hỗ trợ tệp thưa thớt.

+0

Hmmm ... theo một nghĩa nào đó, ngã ba dữ liệu là một thứ không ổn định, và ngã ba tài nguyên là một phần lẻ đặc biệt, phải không? Không phải là nó quan trọng theo cách nào cả. Chúc mừng. – dmckee

+0

Có, "tài nguyên ngã ba" là một cổ xưa. Hầu hết các chương trình chỉ xử lý "dữ liệu ngã ba". – ephemient

+0

Cảm ơn - Tôi sẽ chỉnh sửa nhận xét của mình để sửa lỗi của tôi –

1

hdiutil có thể xử lý ảnh và tệp thưa thớt nhưng tiếc là khung liên kết với nó là riêng tư. Bạn có thể thử xác định các biểu tượng bên ngoài như được định nghĩa bởi khung DiskImages bên dưới nhưng điều này rất có thể không được chấp nhận đối với mã sản xuất, vì khung là riêng tư, bạn phải đảo ngược các trường hợp sử dụng của nó.

Cristi: ~ diciu $ otool -L/usr/bin/hdiutil

/usr/bin/hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (phiên bản tương thích 1.0 .8, phiên bản hiện tại 194.0.0) [..]

cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '' '{print $ 3}' | C++ filt | grep -i thưa thớt

[..]

CSparseFile :: sector2Band (lâu dài)

CSparseFile :: addIndexNode()

CSparseFile :: readIndexNode (lâu dài, SparseFileIndexNode *)

CSparseFile :: readHeaderNode (CBackingStore *, SparseFileHeaderNode *, unsigned long)

[... cắt cho ngắn gọn]

Sau Sửa

Bạn thể sử dụng hdiutil như một quá trình bên ngoài và có nó tạo ra một hình ảnh đĩa thưa thớt cho bạn. Từ quy trình C, bạn sẽ tạo một tệp trong hình ảnh đĩa thưa (được gắn).

+0

Xin chào, tôi chỉ cần tìm hiểu về framworks riêng của hdiutil' để đính kèm tệp DMG theo lập trình (tệp đại diện cho ảnh đĩa với phân vùng HFS +). Tôi tự hỏi nếu bạn xảy ra để đào một chút bên trong khuôn khổ DiskImages và tìm phương pháp đúng?thanks – Zohar81

0

Nếu bạn muốn tính di động, phương sách cuối cùng là viết chức năng truy cập của riêng bạn để bạn quản lý chỉ mục và tập hợp các khối.

Về bản chất, bạn quản lý một tệp khi hệ điều hành quản lý đĩa lưu giữ chuỗi các khối là một phần của tệp, bitmap của các khối được phân bổ/miễn phí, v.v.Tất nhiên điều này sẽ dẫn đến một truy cập không được tối ưu hóa và chậm hơn, tôi sẽ khuyên bạn nên sử dụng apprach này nếu yêu cầu tiết kiệm không gian là cực kỳ quan trọng và bạn có đủ thời gian để viết một tập các chức năng truy cập mạnh mẽ.

Và ngay cả trong trường hợp đó, trước tiên tôi sẽ điều tra xem sự cố của bạn có cần giải pháp khác hay không. Có lẽ bạn nên lưu trữ dữ liệu của bạn khác nhau?

0

Nếu bạn tìm kiếm (fseek, ftruncate, ...) để kết thúc, kích thước tệp sẽ tăng lên mà không cần phân bổ khối cho đến khi bạn ghi vào lỗ. Nhưng không có cách nào để tạo ra một tập tin ma thuật tự động chuyển đổi khối zeroes thành lỗ. Bạn phải làm điều đó cho chính bản thân mình.

Điều này có thể hữu ích khi xem xét (lệnh OpenBSD cp chèn lỗ thay vì viết số 0). patch

+0

Điều này đúng trên Linux, nhưng không phải trên hệ thống tệp Mac OS X mặc định, HFS +. Xem câu trả lời của tôi cho câu hỏi này. – titaniumdecoy

+0

> Nếu bạn tìm kiếm (fseek, ftruncate, ...) để kết thúc, kích thước tệp sẽ tăng lên mà không cần phân bổ khối Điều này có vẻ không đúng trên OSX –

11

Dường như có sự nhầm lẫn về việc liệu hệ thống tệp Mac OS X mặc định (HFS +) có hỗ trợ lỗ trong tệp hay không. Chương trình sau đây chứng minh rằng đây không phải là trường hợp.

#include <stdio.h> 
#include <string.h> 
#include <fcntl.h> 
#include <unistd.h> 

void create_file_with_hole(void) 
{ 
    int fd = open("file.hole", O_WRONLY|O_TRUNC|O_CREAT, 0600); 
    write(fd, "Hello", 5); 
    lseek(fd, 99988, SEEK_CUR); // Make a hole 
    write(fd, "Goodbye", 7); 
    close(fd); 
} 

void create_file_without_hole(void) 
{ 
    int fd = open("file.nohole", O_WRONLY|O_TRUNC|O_CREAT, 0600); 
    write(fd, "Hello", 5); 
    char buf[99988]; 
    memset(buf, 'a', 99988); 
    write(fd, buf, 99988); // Write lots of bytes 
    write(fd, "Goodbye", 7); 
    close(fd); 
} 

int main() 
{ 
    create_file_with_hole(); 
    create_file_without_hole(); 
    return 0; 
} 

Chương trình tạo hai tệp, mỗi tệp 100.000 byte, một trong số đó có lỗ 99.988 byte.

Trên Mac OS X 10.5 trên một phân vùng HFS +, cả hai tập tin mất cùng số khối đĩa (200):

$ ls -ls 
total 400 
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.hole 
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.nohole

Trong khi trên CentOS 5, các tập tin mà không cần lỗ tiêu thụ 88 khối đĩa hơn khác:

$ ls -ls 
total 136 
24 -rw------- 1 user nobody 100000 Oct 10 13:46 file.hole 
112 -rw------- 1 user nobody 100000 Oct 10 13:46 file.nohole
0

Dường như OS X hỗ trợ các file thưa thớt trên khối lượng UDF. Tôi đã thử chương trình thử nghiệm của Titandecoy trên OS X 10.9 và nó đã tạo ra một tệp thưa thớt trên một hình ảnh đĩa UDF. Ngoài ra, UFS không còn được hỗ trợ trong OS X nữa, vì vậy nếu bạn cần các tệp thưa thớt, UDF là hệ thống tệp duy nhất được hỗ trợ nguyên bản hỗ trợ chúng.

Tôi cũng đã thử chương trình trên cổ phiếu SMB. Khi máy chủ là Ubuntu (hệ thống tập tin ext4) chương trình tạo ra một tệp thưa thớt, nhưng 'ls-ls' thông qua SMB không hiển thị điều đó. Nếu bạn thực hiện 'ls -ls' trên chính máy chủ Ubuntu, nó sẽ hiển thị tệp bị thưa thớt. Khi máy chủ là Windows XP (hệ thống tệp NTFS), chương trình không tạo ra tệp thưa thớt.

Các vấn đề liên quan