繁体   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