Не удается удалить файл в папке в 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/», он отлично работает

Почему вы закомментировали использование fullpath?

Scott Hunter 16.05.2022 16:50

Вы хотели использовать /tmp ?

OldProgrammer 16.05.2022 16:51

Что произойдет, если пользователь запустит две или более копий этой программы одновременно? Вам нужно использовать временные уникальные имена файлов (не /tmp/replace.txt), если вы собираетесь делать это правильно.

jarmod 16.05.2022 17:15
tmp/filename — это не то же самое, что /tmp/filename, если только ваш текущий каталог не является корневым каталогом.
Barmar 16.05.2022 17:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Написать:

fptmp = tmpfile();

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

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

Владелец файла может удалить его (не только root).

jarmod 16.05.2022 17:17

О верно. Может быть, это из-за отсутствия начальной косой черты?

Promitheas Nikou 16.05.2022 17:23

Липкий бит, вероятно, был проблемой; может он пытался редактировать чужие файлы

Promitheas Nikou 16.05.2022 19:35

Другие вопросы по теме