C++ 无法在 Windows 环境中删除文件

st4*_*gut -1 c++ visual-studio

在使用 XCODE 一段时间后,我想尝试一下 Microsoft Visual Studio IDE。我能够导入我的所有代码,但无法弄清楚为什么该remove功能在 Windows 环境中不起作用。该文件正在写入C:\Users\Linus\source\proj\proj我的项目的同一位置。我很困惑,因为我的程序可以读写文件,但不能删除它们。我在 XCODE 删除文件时没有任何问题,即使我更改了它的方案(文件被写入另一个目录并且删除工作正常)。我对 Visual Studio 没有太多经验,非常感谢有关正确设置我的项目的任何建议,以便我可以删除文件。

项目.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;
}
Run Code Online (Sandbox Code Playgroud)

项目目录

 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
Run Code Online (Sandbox Code Playgroud)

Ala*_*les 5

在 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;
}
Run Code Online (Sandbox Code Playgroud)

注意:即使这可能并不总是有效,尤其是在存在病毒检查程序的情况下,这些程序可能在您调用 remove 之前打开了您的文件。