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

时间:2018-06-07 15:35:01

标签: c++ visual-studio

我希望在使用XCODE一段时间后为Microsoft Visual Studio IDE提供一个镜头。我能够导入所有代码,但无法弄清楚为什么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

1 个答案:

答案 0 :(得分:4)

在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;
}

注意:即使这可能并不总是有效,尤其是在您调用删除之前可能已打开文件的病毒检查程序中。