C++ не может удалить файл в среде Windows

Я хотел попробовать Microsoft Visual Studio IDE после некоторой работы над XCODE. Мне удалось импортировать весь свой код, но я не могу понять, почему функция remove не работает в среде Windows. Файл записывается на C:\Users\Linus\source\proj\proj в том же месте, что и мой проект. Я сбит с толку, потому что моя программа может записывать и читать файлы, но не может их удалить. У меня не было проблем с удалением файла XCODE, даже когда я изменил его схему (файлы были записаны в другой каталог, и удаление прошло нормально). У меня нет большого опыта работы с Visual Studio, и я был бы очень признателен за любые советы по правильной настройке моего проекта, чтобы я мог удалять файлы.

project.cpp

#include "stdafx.h"
#include "iostream"
#include "fstream"

using namespace std;


int main()
{
    ifstream newFile("newFile.txt");
    if (remove("newFile.txt") != 0) {
        cout << "removed file" << endl;
    }
    return 0;
}

Каталог проектов

 Directory of C:\Users\Linus\source\repos\proj\proj

06/06/2018  11:49 PM    <DIR>          .
06/06/2018  11:49 PM    <DIR>          ..
06/07/2018  08:03 AM    <DIR>          Debug
06/06/2018  11:41 PM               288 proj.cpp
06/06/2018  11:49 PM             8,362 proj.vcxproj
06/06/2018  11:48 PM             1,519 proj.vcxproj.filters
06/06/2018  11:41 PM               165 proj.vcxproj.user
06/07/2018  08:03 AM                16 firstHalf.txt
06/07/2018  08:03 AM                 0 newFirstHalf.txt
06/07/2018  08:03 AM                 0 newSecondHalf.txt
06/07/2018  08:03 AM                28 random.txt          //can't remove this
06/07/2018  08:03 AM                14 secondHalf.txt
06/06/2018  11:41 PM               602 stdafx.cpp
06/06/2018  11:41 PM               642 stdafx.h
06/06/2018  11:41 PM               630 targetver.h
              12 File(s)         12,266 bytes
               3 Dir(s)  37,871,968,256 bytes free

Закройте файл перед его удалением

MrTux 07.06.2018 17:37

Windows - это не Unix. Открытый файл заблокирован, вы не можете его удалить, не можете открыть в другом процессе и т. д. Это не имеет ничего общего с C++ или MSVC.

n. 1.8e9-where's-my-share m. 07.06.2018 17:41

Вы также не проверяете errno, чтобы понять, почему он не удался.

Mgetz 07.06.2018 17:41

Почему вы открываете файл, а затем удаляете его?

Martin Véronneau 07.06.2018 18:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 503
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В Mac / Linux / Unix вы можете удалить открытый файл, потому что файловые системы достаточно умны, чтобы знать, что при удалении открытого файла не удалять фактический файл на диске, пока не будет закрыт последний дескриптор.

В Windows нет этой концепции, поэтому обычно файлы, открытые в программе, не могут быть удалены (хотя обычно их можно переименовать).

Чтобы исправить код, закройте поток перед удалением файла:

#include "stdafx.h"
#include "iostream"
#include "fstream"

using namespace std;


int main()
{
    ifstream newFile("newFile.txt");
    if (!newFile) {
        cout << "file not opened" << endl;
        return 1;
    }
    newFile.close();
    if (remove("newFile.txt") == 0) {
        cout << "removed file" << endl;
    }
    return 0;
}

Примечание: даже это может не всегда работать, особенно при наличии антивирусных программ, которые могли открыть ваш файл до того, как вы вызовете remove.

Извините, но не могли бы вы подробнее рассказать, что такое ручка? Что произойдет, если вы удалите файл на диске до закрытия последнего дескриптора?

I Like 07.06.2018 18:40

Под дескриптором файла я подразумеваю ссылку на файл, который дается процессу, когда он открывает этот файл. В файлах Unix есть счетчики ссылок, поэтому, хотя вы можете удалить имя файла, фактический файл не удаляется с диска до тех пор, пока последний дескриптор не закроется и счетчик ссылок не достигнет нуля. В Windows вы не можете удалить файл до закрытия последнего дескриптора.

Alan Birtles 07.06.2018 19:16

о, хорошо, значит, фактический файл не удаляется в UNIX, пока программа не завершится, если нет close?

I Like 07.06.2018 19:29

да, он не будет виден в файловой системе, но все еще находится на диске

Alan Birtles 07.06.2018 19:30
remove() возвращает ненулевое значение в случае ошибки.
Sid S 07.06.2018 21:45

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