Почему std :: remove для файла всегда возвращает -1? - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь удалить файл, если он существует.Поэтому сначала я проверяю, существует ли файл и удаляет ли я его, используя std::remove.test.json содержит некоторые связанные с json txt.У меня также есть #include <cstdio> в комплекте.

   std::string file_to_remove = "test.json";
   std::ifstream f(file_to_remove.c_str());

  if (f.good()) {
    int val = std::remove(file_to_remove.c_str());
    std::cout << "\nRemoving file : " << file_to_remove  << " : ret val : " << val<< std::endl;
  }

Я ожидал, что ret val будет 0, но я получаю -1

Мой текущий вывод:

Удаление файла: test.json: ret val: -1

Я также убедился, что файл закрыт.

Ответы [ 2 ]

4 голосов
/ 02 июля 2019

Из документации std::remove() (выделено мной):

Если файл в данный момент открыт тем или иным процессом, поведение этогофункция определяется реализацией (в частности, системы POSIX отменяют связь имени файла, хотя пространство файловой системы не освобождается, пока последний запущенный процесс не закроет файл; Windows не позволяет удалить файл ).

Значение, если файл открыт, не удалит файл, если вы работаете в Windows.Он вернет ошибку (например, -1).

Любая другая платформа может быть чем угодно, поскольку она определяется реализацией.Я бы исследовал вашу платформу / компилятор и увидел бы, каков результат вызова std::remove() для открытого файла.

После добавления f.close ();раньше std :: remove ret val теперь равно 0

Это имеет большой смысл, так как f.close() закрывает файл.Файл закрыт, его можно удалить.

4 голосов
/ 02 июля 2019

Вы пытаетесь удалить открытый файл.

В системах Posix (например, Linux) можно удалить открытый файл. Он будет продолжать существовать на диске, и вы все равно можете использовать его до тех пор, пока он у вас открыт, но он будет невидим для других, так как его запись в каталоге была удалена. Когда вы закроете файл, он исчезнет.

В Windows вы не можете удалить открытый файл. Проверьте код ошибки с помощью perror или GetLastError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...