如何检查文件是否存在并在C中创建新文件

时间:2015-04-26 13:51:11

标签: c file raspberry-pi

我是C语言编程的新手,我正在使用C编译器为Raspberry Pi编程。我想要做的就是创建一个函数,该函数将String作为参数并将其保存为特定位置的文本文件。我想检查该文件位置以查看存在哪些文件,并将新文件保存到该文件夹​​,并以1的增量添加到文件名中。

例如,文件夹包含:

TestFile1 TestFile2

我希望能够创建保存为TestFile3的新文件。

这是我到目前为止的代码,想知道我是否在正确的位置并获得任何提示:

void WriteToFile(unsigned char *pID)
{
printf("Writing to file. . . . .\n");

/* Checking to see how many files are in the directory. */
int *count = 0;
DIR *d;
struct dirent *dir;
d = opendir("table_orders");
if(d)
{
    while((dir = readdir(d)) != NULL)
    {
        printf("%s\n", dir->d_name);
        count = count + 1; // Adds 1 to count whenever a file is found.
    }
    closedir(d);
}

char str[sizeOf(count)]; // Creates string.
sprintf(str, "%d", count); // Formats count integer into a string.

File *f = fopen("table_orders/Order " + str + ".txt", "a"); // Creates new file.

if(f == NULL)
{
    printf("Error opening file!\n");
    exit(1);
}

fprintf(f, "Order: %s \n", pID);

fclose(f);

printf("The Order %s has been written to the file\n", pID);
}

3 个答案:

答案 0 :(得分:5)

int fd = open( "filename", O_RDWR | O_CREAT | O_EXCL, 0644 );

其他任何东西都不是原子的 - 另一个进程可以在任何存在检查和实际创建文件之间创建文件。

答案 1 :(得分:1)

您可以使用stat(Windows中为_stat)查看文件是否退出。如果在MyStruct设置为errno时失败,则该文件不存在。 access是另一种可能性。

当然,它不是原子的,其他一些流程可以在您的支票和您对ENOENT的通话之间创建该文件。

答案 2 :(得分:-1)

你很亲密,但到目前为止,我认为你需要搁置它。阅读一些带有结构化示例的c教程。 当您通读目录并随意增加计数时,您会遇到算法错误。逻辑应该更像      解析dir->名称为3个令牌“Testfile”0001“.log”      使用atoi或类似的方法将数字字符串转换为int

当你宣布str缺乏对sizeof的理解时,它应该更像是     char str [25]; 这足以将4字节int的所有数字保存为字符串。 sizeof count可能是4个,4个字节是32位。

当你fopen你做“Dir / file”+ str +“。log”之类的事情时 这不是你怎么做的,+是c中的数学。您需要将strcat或sprintf用于新的工作字符串,即时创建和释放。

将数字附加到此处的文件时,将短数字加在0秒之前是有意义的。这会生成具有良好ls顺序的常规文件名。

如果您需要控制创建和排他性,则需要使用open打开文件并将其打开到FILE类型的文件句柄。

当您使用此功能时,您需要通过安排使用信号量或“.lock”文件来防止导致计时错误的另一个进程。

您还需要一些维护例程来删除旧日志,然后重新编号001

中的所有剩余日志 PS不知道为什么下来投票