【问题标题】:DeleteFile() not working删除文件()不起作用
【发布时间】:2017-01-26 16:57:37
【问题描述】:

我在尝试DeleteFile()函数,我写了下面的程序。

#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main(){
    FILE * filetxt;
    // creat a file
    filetxt = fopen("C:\\Users\\Thomas\\Desktop\\filetxt.txt", "w");

    // delete the file 
    if (DeleteFile("\\\\.\\C:\\Users\\Thomas\\Desktop\\filetxt.txt") != 0){
        cout<<"success";
    }else{
        cout<<"fail";
    }
    cin;
}

但是程序没有按预期运行。创建的文件没有被删除。

输出是:

fail

【问题讨论】:

  • 那是因为你打开了那个文件。您应该先关闭该文件,然后再尝试删除它
  • 为什么不打电话给GetLastError看看文件删除失败的原因?
  • 尝试在"// delete the file"行前添加fclose();
  • > 如果应用程序尝试删除为正常 I/O 或作为内存映射文件打开了其他句柄的文件,DeleteFile 函数将失败(打开其他句柄时必须指定 FILE_SHARE_DELETE) .
  • 我很惊讶 \\.\ 路径表示法适用于非 Unicode 版本的 DeleteFile。

标签: c++ c winapi


【解决方案1】:

您使用fopen 打开文件并调用DeleteFile 之前使用fclose 关闭它。

你可以从DeleteFile MSDN documentation读到:

如果应用程序尝试删除,DeleteFile 函数会失败 为正常 I/O 打开其他句柄的文件或作为 内存映射文件(FILE_SHARE_DELETE 必须已指定 当其他句柄打开时)。

另请注意,如果失败,您可以在DeleteFile 之后调用GetLastError 以获取错误代码,其中包含有关失败原因的更多信息。

【讨论】:

  • 回答有关共享违规的问题,甚至不提及共享,充其量是不完整的。您没有必须在删除文件之前关闭它。您只需确保使用适当的共享模式打开它。不打开文件等同于共享任何内容,但这只是更普遍问题的一个特例:确保不会引发共享冲突。
  • @IInspectable 我鼓励您编写自己的答案,而不是对其他人的答案做出“非常不完整”之类的判断。等等,I've found an answer of yours 在 Unicode 项目中从 std::string 转换为 CString,没有提及代码页和 std::string 的编码。我猜它仍然“非常不完整”,但无论如何......
  • 啊该死的。必须 -1 这个,因为是你。
  • @IInspectable 啊该死的。我对你的另一个答案表示赞同,只是因为是你。您可以否决我的每个答案,但我仍然认为这个(虽然不完美)是一个有效的好答案,不值得投反对票。当人们开始理解为更谦虚、更尊重他人的努力和时间时,Stackoverflow 将成为一个更好的社区。​​span>
  • 谦虚地接受voting is important,即使你不喜欢它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2016-09-16
  • 2016-10-13
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多