none
Win7下CreateFile失败 Show error message of GetLastError系统找不到指定的文件 RRS feed

  • 问题

  • 已关闭WIN7的UAC控制,操作系统为Win7-64位旗舰版 编译环境为 VS2013 Express

    #include <Windows.h> #include <stdio.h> #define BUF_SIZE 256 //Show error message of GetLastError() void ShowSystemError(); int main(int argc, LPTSTR argv[]) { HANDLE hIn, hOut; DWORD nIn, nOut; CHAR buffer[BUF_SIZE]; if (argc != 3) { printf("Usage: cpw file1 file2\n"); return 1; }

    printf("%s\n", argv[1]);
    printf("%s\n", argv[2]);

    hIn = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hIn == INVALID_HANDLE_VALUE) { printf("Cannot open input file. Error: %x\n", GetLastError()); ShowSystemError(); return 2; } ....


    D:\>dir *.txt
     驱动器 D 中的卷是 工作
     卷的序列号是 4899-7761

     D:\ 的目录

    2014/02/09  22:45                18 A.txt.txt
                   1 个文件             18 字节
                   0 个目录 251,909,156,864 可用字节

    D:\>cpw A.txt B.txt
    A.txt
    B.txt
    Cannot open input file. Error: 2

    void ShowSystemError()函数弹出对话框 系统找不到指定的文件 

    同样代码在32位xp下VS2010 能够正常运行

    试过各种办法。。。百思不得其解




    2014年2月9日 14:50

答案

  • 不是路径问题 是编码问题 编码另开帖讨论 解决方案如下: 在VS中默认使用的是宽字符(Unicode编码) 项目字符集调整为 使用多字节字符集 再去掉(LPCWSTR) 程序运行正常 结贴!
    • 已标记为答案 ByLee_SEU 2014年2月16日 13:04
    2014年2月16日 13:04

全部回复

  • 你好,

    Windows Server 2003  Windows XP中可以使用CreateFile 函数直接对磁盘和卷进行访问。

    但是, 在 Windows Vista 和 Windows Server 2008 中对文件系统和存储堆栈进行的更改可限制对磁盘和卷的直接访问 .

    更多信息请打开上面的链接查看。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年2月10日 6:55
    版主
  • 那在win7下不能使用createfile获得句柄了么。。。 cmd下 copy命令还是可以正常使用的啊
    2014年2月10日 14:16
  • 目测和 UAC 没有关系,如果有关系的话,关闭 UAC 也是没用的(它只是不提示,不代表你的进程有权限),必须以管理员权限运行你的程序。

    你应该检查下你要打开的文件路径是否正确,你可以传递绝对路径来规避相对路径的问题。

    2014年2月11日 3:16
  • hIn = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    改为

    hIn = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);

    或者

    hIn =CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


    麻烦把正确答案设为解答。

    2014年2月11日 3:27
    版主
  • 我是想复制文件,实现类似copy命令的用法

    CREATE_NEW 或者 CREATE_ALWAYS 会把源文件覆盖掉的吧 

    2014年2月11日 13:16
  • 如果有源文件可以使用OpenFile.


    麻烦把正确答案设为解答。

    2014年2月12日 2:01
    版主
  • 和CreateFile函数相比,请优先考虑win32的CreateFile函数(它能打开命名管道和控制Unicode文件名,同时不受128个字符的路径名称的限制)
    2014年2月16日 12:34
  • 不是路径问题 是编码问题 编码另开帖讨论 解决方案如下: 在VS中默认使用的是宽字符(Unicode编码) 项目字符集调整为 使用多字节字符集 再去掉(LPCWSTR) 程序运行正常 结贴!
    • 已标记为答案 ByLee_SEU 2014年2月16日 13:04
    2014年2月16日 13:04