在即時通訊系統開發中,聊天記錄的持久化儲存是核心模組之一。本文針對 Linux 環境下使用 C 語言在特定資料夾建立可重新命名的檔案,提供完整的程式碼範例與關鍵步驟解析。
在 C 語言中,建立檔案的關鍵在於構建正確的完整路徑,並使用 fopen 函數以寫入模式開啟檔案。若檔案不存在,fopen 會自動建立;若目錄不存在,則需先呼叫 mkdir 建立目錄。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> // mkdir 所需
#include <sys/types.h>
#define BASE_DIR "/home/user/chat_logs/" // Linux 路徑,請依實際環境修改
#define MAX_PATH_LEN 256
int main() {
char filename[100];
char fullpath[MAX_PATH_LEN];
FILE *fp;
// 1. 確保基礎目錄存在
struct stat st = {0};
if (stat(BASE_DIR, &st) == -1) {
mkdir(BASE_DIR, 0755); // 建立目錄,權限 rwxr-xr-x
printf("目錄已建立: %s\n", BASE_DIR);
}
// 2. 取得使用者輸入的檔案名稱 (可隨時改名)
printf("請輸入欲建立的檔案名稱 (不含路徑): ");
if (scanf("%99s", filename) != 1) {
fprintf(stderr, "輸入錯誤\n");
return 1;
}
// 3. 安全拼接完整路徑
// 使用 snprintf 防止緩衝區溢位
snprintf(fullpath, sizeof(fullpath), "%s%s.txt", BASE_DIR, filename);
// 4. 以寫入模式開啟/建立檔案 ("w" 會截斷舊檔,"a" 為附加)
fp = fopen(fullpath, "w");
if (fp == NULL) {
perror("建立檔案失敗");
return 1;
}
printf("檔案已成功建立於: %s\n", fullpath);
// 5. 寫入測試資料 (模擬聊天記錄)
fprintf(fp, "--- 聊天記錄開始 ---\n");
fprintf(fp, "時間: 2023-10-27 10:00:00\n");
fprintf(fp, "用戶: Hello World!\n");
// 6. 關閉檔案,釋放資源
fclose(fp);
return 0;
}
原問題中的回答使用 c:\\%s.c 為 Windows 路徑格式。在 Linux 下必須使用正斜線 / 作為路徑分隔符,且目錄結構通常為 /home/user/... 或 /var/log/...。
建議使用 snprintf 取代 sprintf,可指定緩衝區大小,有效防止緩衝區溢位漏洞。
程式碼中使用 stat 檢查目錄是否存在,不存在則呼叫 mkdir 建立。這避免了因目錄不存在導致 fopen 失敗的問題。
檢查 fopen 回傳值是否為 NULL,並使用 perror 輸出系統錯誤訊息,是穩健程式的必要習慣。
若需根據日期時間自動命名 (如 chat_20231027_100000.log),可引入 <time.h> 並使用 strftime 格式化時間字串,整合至 snprintf 中即可實現全自動歸檔。