Các giao diện gọi hệ thống thông thường có cho phép giảm kích thước của tệp (mà không thay thế nó bằng một nút khác) không?


9

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.


2
Chỉ cần mở một tệp có fopentrong 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ũ?
Wyzard

4
Chỉ cần FYI, open()openat()đã có một cờ để cắt bớt, O_TRUNCvì 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 stracetrê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.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy Tôi đã nghĩ đến việc thu nhỏ đến một kích thước tùy ý. Tôi đã đánh giá cao câu trả lời của David Foerster vì nó trả lời một tập hợp con của câu hỏi, nhưng tôi không chấp nhận nó dưới ánh sáng của icarus. Tôi sẽ coi đó là câu trả lời có và không, trong khi câu trả lời của icarus đã cho thấy câu trả lời thực sự là "có".
JoL

Câu trả lời:


22

man -s 2 ftruncate nói

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

Nó tiếp tục nói rằng nếu bạn sử dụng ftruncate, bạn phải mở tệp để viết và nếu bạn sử dụng cắt bớt thì tệp phải có thể ghi được.


Việc thêm vào một tệp làm cho HĐH trước tiên truncatephải phù hợp với kích thước tệp mới và sau đó là write tệp. Vì vậy, truncatecuộc gọi hệ thống bạn đang tìm kiếm.
mgarciaisaia

1
Trên Linux, xem thêmfallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas

2

Cuộc open(2)gọi hệ thống chấp nhận O_TRUNCcờ có thể giảm kích thước tệp:

O_TRUNC- Nếu tệp tồn tại và là tệp thông thường và tệp được mở thành công O_RDWRhoặc O_WRONLY, độ dài của tệp sẽ bị cắt về 0, chế độ và chủ sở hữu sẽ không thay đổi. Nó sẽ không có hiệu lực đối với các tệp đặc biệt của FIFO hoặc các tệp thiết bị đầu cuối. Tác dụng của nó đối với các loại tệp khác là định nghĩa triển khai. Kết quả của việc sử dụng O_TRUNCmà không có O_RDWRhoặc O_WRONLYkhông được xác định.

Nó thường được sử dụng khi chương trình nhằm ghi đè lên toàn bộ nội dung của tệp. Một ví dụ là toán tử chuyển hướng tập tin shell của bạn như trong command > file.

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.