无法使用createFile API在Windows中创建文件

 芙蓉花 发布于 2023-02-12 14:48

我无法使用CreateFileAPI 在Windows中创建文件,GetLastError返回错误代码80,这意味着文件存在,但实际上文件不存在.

hFile = CreateFile((LPCTSTR) FILEPATH,  // name of the write 
    GENERIC_READ|GENERIC_WRITE,         // open for writing
    0,                                  // do not share
    NULL,                               // default security 
    CREATE_ALWAYS,                      // create new file only 
    FILE_ATTRIBUTE_NORMAL,              // normal file
    NULL);                              // no attr. template
printf("GET LAST ERROR VALUE IS: %d\n", GetLastError());

我究竟做错了什么?

1 个回答
  • 您的错误检查是错误的.文件说:

    返回值

    如果函数成功,则返回值是指定文件,设备,命名管道或邮件槽的打开句柄.

    如果函数失败,则返回值为INVALID_HANDLE_VALUE.要获取扩展错误信息,请致电GetLastError.

    换句话说,失败由返回值决定.您不能GetLastError用来确定失败.您必须检查返回值并进行比较INVALID_HANDLE_VALUE.当你这样做时,我预测你会发现返回值不等于INVALID_HANDLE_VALUE.


    实际上,即使函数成功,此API也会使用最后一个错误值来传递额外信息.

    来自以下文件CREATE_ALWAYS:

    如果指定的文件存在且可写,则该函数将覆盖该文件,该函数成功,并将最后一个错误代码设置为ERROR_ALREADY_EXISTS(183).

    并从以下文件CREATE_NEW:

    仅当新文件尚不存在时才创建新文件.如果指定的文件存在,则函数失败,最后一个错误代码设置为ERROR_FILE_EXISTS(80).

    等等.

    黄金法则,你必须燃烧到你的记忆中,是错误检查因功能而异,你必须从头到尾阅读文档.


    请注意,我对你的(LPCTSTR)演员表示怀疑.那只是在惹麻烦.如果路径类型错误,编译器将自行保存,除非您使用该转换.该演员只是告诉编译器闭嘴.但在这里它知道的更好.该演员表将允许您将ANSI文本传递给广泛的API,反之亦然.你真的应该删除它.

    2023-02-12 14:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有