Я хотел попробовать 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
Windows - это не Unix. Открытый файл заблокирован, вы не можете его удалить, не можете открыть в другом процессе и т. д. Это не имеет ничего общего с C++ или MSVC.
Вы также не проверяете errno, чтобы понять, почему он не удался.
Почему вы открываете файл, а затем удаляете его?





В 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.
Извините, но не могли бы вы подробнее рассказать, что такое ручка? Что произойдет, если вы удалите файл на диске до закрытия последнего дескриптора?
Под дескриптором файла я подразумеваю ссылку на файл, который дается процессу, когда он открывает этот файл. В файлах Unix есть счетчики ссылок, поэтому, хотя вы можете удалить имя файла, фактический файл не удаляется с диска до тех пор, пока последний дескриптор не закроется и счетчик ссылок не достигнет нуля. В Windows вы не можете удалить файл до закрытия последнего дескриптора.
о, хорошо, значит, фактический файл не удаляется в UNIX, пока программа не завершится, если нет close?
да, он не будет виден в файловой системе, но все еще находится на диске
remove() возвращает ненулевое значение в случае ошибки.
Закройте файл перед его удалением