簡體   English   中英

創建目錄和存儲文件(C編程)

[英]Create Directory and Store File (C programming)

我想創建一個目錄,該目錄的名稱以進程ID結尾(以使其唯一),然后將我剛剛寫入的新文件存儲在該目錄中。

我想要的是:

1)創建一個名為: mydirectory.1923的新目錄(進程ID號示例)

2)存儲我剛剛使用創建的文件

FILE * fPointer = fopen("new.txt",w+)

進入mydirectory.1923

我到目前為止所擁有的是:

int bufSize = 20;
int pid = getpid();
char *fileName = malloc(bufSize);
char *prefix = "that.rooms.";
snprintf(fileName, bufSize,"%s%d", prefix, pid);
printf("%s\n",fileName);
struct stat st = {0};
if (stat(fileName, &st) == -1) {
    mkdir(fileName, 0755);
}
DIR *dir = opendir (fileName);
if (dir != NULL) {

    FILE *fLib = fopen("library.txt" , "w+");
    fclose(fLib);

}
closedir(fileName);

return 0;

我的問題:

該代碼不起作用,顯然它在DIR部分顯示錯誤。

如果要創建目錄,創建文件並將該文件直接存儲到新目錄,這是正確的做法嗎?

有什么建議或建議可以做得更好嗎? 謝謝。

一些評論:

  • 如上所述,您確實應該為目錄名稱分配更多空間,一個5位數的pid將立即破壞您的代碼。 limits.h中包含宏PATH_MAXFILE_MAX
  • 您無需打開任何目錄。 這通常用於遍歷目錄中的項目。 您只想在其中創建一個文件。
  • 即使您並不是真的需要它, closedir函數也會收到一個DIR *參數,我想這將是您代碼中的dir
  • 要在新目錄中創建文件,應在創建路徑中包含目錄,或者在fopen調用之前至少將其包含在chdir中。 我不建議使用后者,因為它會影響整個進程的工作目錄。

以下是您的代碼的快速且骯臟的修補版本,它考慮到上述因素,創建了目錄和其中的新文件:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <limits.h>

int main(int argc, char **argv){
    int pid = getpid();
    char dirName[NAME_MAX+1];
    char *prefix = "that.rooms.";
    snprintf(dirName, NAME_MAX + 1,"%s%d", prefix, pid);
    printf("%s\n",dirName);
    struct stat st = {0};
    if (stat(dirName, &st) == -1) {
        if(mkdir(dirName, 0755) != -1){
            char libPath[PATH_MAX+1];
            snprintf(libPath, PATH_MAX + 1, "%s/library.txt", dirName);

            FILE *fLib = fopen(libPath , "w+");
            fclose(fLib);
        }else{
            perror("mkdir: ");
        }
    }
    return 0;
}

更改了變量名稱,使它更清晰:

  • dirName用於保存目錄名稱。 它使用NAME_MAX因為這是文件名長度的系統限制
  • libPath用於保存要創建的library.txt文件的路徑。 如果您的pid是3123,則libPath會在snprintf調用后讀取that.rooms.3123/library.txt 它使用PATH_MAX因為這是文件路徑長度的系統限制。

暫無
暫無

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

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