Не удается удалить файл в папке в C

Я делаю текстовый редактор в терминале, одна из его функций - редактировать определенную строку. Для этого

Я создаю новый временный текстовый файл, удаление старого/исходного и переименовать временный в исходный.

Вот код:

FileLineEdit(char filename[20], int line, char newline[1000]){

    FILE * fp;
    FILE * fptmp;

    char buffer[1000];
    int count;

    int ret;


    fp  = fopen(filename, "r");
    fptmp = fopen("tmp/replace.txt", "w");

    if (fp == NULL || fptmp == NULL)
    {
        printf("\nErro!\n");
        exit(1);
    }

    count = 0;
    while ((fgets(buffer, 1000, fp)) != NULL)
    {
        count++;

        if (count == line)
            fputs(newline, fptmp);
        else
            fputs(buffer, fptmp);
    }

    fclose(fp);
    fclose(fptmp);

    //strcat(fullpath, filename);
    //printf("%s", fullpath);

   ret = remove(filename);

   if (ret == 0) {
      printf("File deleted successfully");
   } else {
      printf("Error: unable to delete the file");
   }

    rename("tmp/replace.txt", "tmp/a.txt");

    getch();

}

Вывод постоянно: Error: unable to delete the file

Кстати, как только я попробую это вне папки «tmp/», он отлично работает

🤔 А знаете ли вы, что...
C стандартизирован ISO и ANSI, что обеспечивает переносимость кода между различными компиляторами и платформами.


3
47
1

Ответ:

Решено

В папке /tmp установлен липкий бит (s), а это значит, что любой может читать и создавать/изменять файлы в ней, но только ее владелец (root) может их удалить.

Итак, если вы хотите, чтобы ваша программа делала это, вы должны делать это в каком-либо каталоге, отличном от /tmp

Кроме того, как указал jarmod, у вас не должно быть жестко закодированного имени файла для вашего временного имени файла. Вы должны использовать tmpfile или тмпнам для этой цели: Вместо:

fptmp = fopen("tmp/replace.txt", "w");

Написать:

fptmp = tmpfile();

Файл будет автоматически удален при закрытии файлового потока.

(Вы можете прочитать больше о /tmp директоре здесь)