簡體   English   中英

截斷 c++ 中的文件

[英]Truncating the file in c++

我正在用 C++ 編寫一個程序,想知道是否有人可以幫助我解決這里解釋的情況。

  1. 假設我有一個大小約為 30MB 的日志文件,我已將最后 2MB 的文件復制到程序內的緩沖區中。

  2. 我刪除文件(或清除內容),然后將我的 2MB 寫回文件。

直到這里一切正常。 但是,問題是我讀取文件(最后 2MB)並清除文件(30MB 文件),然后寫回最后 2MB。 如果在我從 1GB 文件復制最后 300MB 文件的情況下,將需要很多時間。

有沒有人有讓這個過程更簡單的想法?

當日志文件很大時,應該並且將考慮以下原因。

磁盤空間:日志文件是未壓縮的純文本,占用大量空間。 典型的壓縮將文件大小減少 10:1。 但是,文件在使用(鎖定)時無法壓縮。 所以日志文件必須輪換使用。

系統資源:定期打開和關閉文件會消耗大量系統資源,並會降低服務器的性能。

文件大小:小文件在發生故障時更容易備份和恢復。

我只是不想將最后的特定行復制、清除和重新寫入文件。 只是一個更簡單的過程.... :-)

編輯:不進行任何內部流程來支持日志輪換。 logrotate 是工具。

我會建議一種稍微不同的方法。

  1. 創建一個新的臨時文件
  2. 將所需數據從原始文件復制到臨時文件
  3. 關閉兩個文件
  4. 刪除原始文件
  5. 將臨時文件重命名為與原始文件相同的名稱

為了提高復制的性能,您可以分塊復制數據,您可以玩轉塊大小以找到最佳值。

如果這是您之前的文件:

-----------------++++

其中-是您不想要的, +是您想要的,最便攜的獲取方式:

++++

……正如你所說。 閱讀您想要的部分( + ),刪除/清除文件(如fopen(... 'wb') or something similar並寫出您想要的位( + )。

任何更復雜的東西都需要特定於操作系統的幫助,並且不可移植。 不幸的是,我不相信任何主要的操作系統都支持你想要的。 可能支持“在 position X之后截斷”(一種head ),但不支持您請求的類似tail的操作。

這樣的操作將難以實現,因為文件系統上的不同塊大小(如果文件系統具有塊大小)會導致麻煩。 充其量,您將僅限於削減塊大小的邊界,但這將是哈利。 這種情況非常罕見,這可能就是為什么不直接支持這種程序的原因。

更好的方法可能是不要讓文件變得那么大,而是使用輪換日志文件,每個日志文件設置最大大小並保留最大數量的舊文件。

如果您可以控制寫入過程,那么您可能在這里要做的就是像循環緩沖區一樣寫入文件。 這樣您就可以保留最后 X 字節的數據,而無需按照您的建議進行操作。

即使您無法控制寫入過程,如果您至少可以控制它寫入的文件,那么也許您可以讓它寫入一個名為 pipe的文件。 您可以在此名為 pipe 的末尾附加您自己的程序,如所討論的那樣寫入循環緩沖區

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM