首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言在 Linux 環境下於指定目錄建立檔案的完整指南

     編輯:C 語言問答

前言

在即時通訊系統開發中,聊天記錄的持久化儲存是核心模組之一。本文針對 Linux 環境下使用 C 語言在特定資料夾建立可重新命名的檔案,提供完整的程式碼範例與關鍵步驟解析。

核心概念:路徑拼接與 fopen

在 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;
}

關鍵點解析

1. 路徑處理差異 (Windows vs Linux)

原問題中的回答使用 c:\\%s.c 為 Windows 路徑格式。在 Linux 下必須使用正斜線 / 作為路徑分隔符,且目錄結構通常為 /home/user/... 或 /var/log/...。

2. 安全的字串格式化

建議使用 snprintf 取代 sprintf,可指定緩衝區大小,有效防止緩衝區溢位漏洞。

3. 目錄存在性檢查

程式碼中使用 stat 檢查目錄是否存在,不存在則呼叫 mkdir 建立。這避免了因目錄不存在導致 fopen 失敗的問題。

4. 錯誤處理

檢查 fopen 回傳值是否為 NULL,並使用 perror 輸出系統錯誤訊息,是穩健程式的必要習慣。

進階應用:動態檔案命名

若需根據日期時間自動命名 (如 chat_20231027_100000.log),可引入 <time.h> 並使用 strftime 格式化時間字串,整合至 snprintf 中即可實現全自動歸檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved