Có cách nào để open()
một tập tin và làm cho nó co lại? Tất nhiên, người ta có thể mở chúng ở chế độ chắp thêm hoặc tìm đến cuối và viết để khiến chúng phát triển. Tuy nhiên, theo tôi biết, không có phương pháp nào để thu nhỏ tệp thông qua các giao diện gọi hệ thống kiểu unix điển hình.
Cách duy nhất để làm như vậy, theo như tôi biết, là làm giả nó bằng cách tạo một tệp mới ngắn hơn và thay cho tệp rename()
cũ hơn.
Tôi chỉ muốn xác nhận, vì tôi thấy một câu trả lời ngụ ý rằng có thể thực hiện các trình chỉnh sửa tệp làm việc trực tiếp trên tệp thay vì trải qua quá trình tạo tệp mới và đổi tên tại chỗ.
Tôi đã luôn nghĩ rằng tập tin api trong giao diện gọi hệ thống kiểu libc và unix không cho phép thu nhỏ các tập tin để dễ dàng thực hiện các hệ thống tập tin và có thể tránh các kiểu sử dụng có thể góp phần phân mảnh.
open()
và openat()
đã có một cờ để cắt bớt, O_TRUNC
vì vậy về mặt kỹ thuật, nó làm cho tập tin bị thu hẹp - nghĩa là thu nhỏ hoàn toàn - mà không thay đổi inode. Ví dụ nổi tiếng nhất đó là command > file.txt
, nơi tập tin sẽ bị cắt bớt nếu nó tồn tại. Nếu bạn chạy strace
trên bash -c 'true > /dev/null'
bạn sẽ thấy openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
trong đầu ra. Tất nhiên đối với kích thước cắt ngắn khác nhau, bạn cần truncate()
tòa nhà. Hãy cho tôi biết nếu bạn muốn đây là một câu trả lời thực tế thay vì bình luận.
fopen
trong chế độ "w" (hoặc "w +") sẽ tự động cắt nó thành độ dài bằng không. Hay bạn có nghĩa là thu nhỏ đến một kích thước khác không, để bảo tồn một số nội dung cũ?