嵌入式Linux:truncate()和ftruncate()函數(shù)截斷文件
使用系統(tǒng)調(diào)用 truncate() 或 ftruncate() 可以將普通文件截斷為指定字節(jié)長度。函數(shù)原型如下所示:
#include <unistd.h> int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);
這兩個函數(shù)的區(qū)別在于:ftruncate() 使用文件描述符 fd 來指定目標(biāo)文件,而 truncate() 則直接使用文件路徑 path 來指定目標(biāo)文件,但它們的功能是一樣的。
這兩個函數(shù)都可以對文件進(jìn)行截斷操作,即將文件截斷為參數(shù) length 指定的字節(jié)長度。截斷的意思是,如果文件目前的大小大于參數(shù) length 所指定的大小,則多余的數(shù)據(jù)將被丟失,相當(dāng)于將多余部分“砍”掉;如果文件目前的大小小于參數(shù) length 所指定的大小,則文件將被擴(kuò)展,擴(kuò)展部分將填充空字節(jié) 。
在使用 ftruncate() 進(jìn)行文件截斷操作之前,必須先調(diào)用 open() 函數(shù)打開該文件以獲取文件描述符,并且必須具有可寫權(quán)限,即調(diào)用 open() 打開文件時需要指定 O_WRONLY 或 O_RDWR。
這兩個函數(shù)調(diào)用并不會影響文件的讀寫位置偏移量,因此在截斷后通常需要重新設(shè)置文件的當(dāng)前讀寫位置偏移量,以防止由于之前指向的位置已經(jīng)不存在而發(fā)生錯誤(例如,文件長度變短后,原來的讀寫位置不再存在)。
調(diào)用成功返回 0,失敗返回 -1,并設(shè)置 errno 以指示錯誤原因。
分別使用 ftruncate() 和 truncate() 將當(dāng)前目錄下的文件 file1 截斷為長度 0 字節(jié),并將文件 file2 截斷為長度 1024 字節(jié)。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> int main(void) { int fd; /* 打開 file1 文件 */ if ((fd = open("./file1", O_RDWR)) < 0) { perror("open error"); exit(EXIT_FAILURE); } /* 使用 ftruncate 將 file1 文件截斷為長度 0 字節(jié) */ if (ftruncate(fd, 0) < 0) { perror("ftruncate error"); exit(EXIT_FAILURE); } /* 使用 truncate 將 file2 文件截斷為長度 1024 字節(jié) */ if (truncate("./file2", 1024) < 0) { perror("truncate error"); exit(EXIT_FAILURE); } /* 關(guān)閉 file1 退出程序 */ if (close(fd) < 0) { perror("close error"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS);}
這個程序是一個簡單的C程序,它演示了如何使用系統(tǒng)調(diào)用 ftruncate() 和 truncate() 來截斷文件。
以下是程序的主要步驟:
導(dǎo)入必要的頭文件。
定義 main() 函數(shù)。
在 main() 函數(shù)中聲明一個整型變量 fd 作為文件描述符。
使用 open() 函數(shù)打開名為 "file1" 的文件,并以讀寫方式打開,如果打開失敗則輸出錯誤信息并退出程序。
使用 ftruncate() 函數(shù)將文件描述符 fd 指向的文件截斷為長度為 0 字節(jié),如果截斷失敗則輸出錯誤信息并退出程序。
使用 truncate() 函數(shù)將名為 "file2" 的文件截斷為長度為 1024 字節(jié),如果截斷失敗則輸出錯誤信息并退出程序。
使用 close() 函數(shù)關(guān)閉文件描述符 fd,釋放資源。
退出程序并返回 0。
總體而言,該程序展示了如何使用 ftruncate() 和 truncate() 函數(shù)來截斷文件的示例,截斷文件的長度可以根據(jù)需要進(jìn)行設(shè)置。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。