Win7下CreateFile失败 错误提示:r系统找不到指定的文件

boyanglee 2014-02-10 10:28:17
已关闭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;
}
....


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

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

...全文
1003 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LuciferStar 2014-02-19
  • 打赏
  • 举报
回复
字符集问题。
「已注销」 2014-02-18
  • 打赏
  • 举报
回复
帮你简单改了下:
int main(int argc, char *argv[])
{
    HANDLE hIn, hOut;
    DWORD nIn, nOut;
    BYTE 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 = CreateFileA(argv[1], GENERIC_READ | GENERIC_WRITE, 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;
    }
 
    hOut = CreateFileA(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        printf("Cannot open input file. Error: %x\n", GetLastError());
        CloseHandle(hIn);
        return 3;
    }
 
    while (ReadFile(hIn, (LPVOID)buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
    {
        WriteFile(hOut, (LPCVOID)buffer, nIn, &nOut, NULL); 
        if (nIn != nOut)
        {
            printf("Fatal write error: %x\n", GetLastError());
            CloseHandle(hIn);
            CloseHandle(hOut);
            return 4;
        }
    }
 
    CloseHandle(hIn);
    CloseHandle(hOut);
 
    return 0;
}
 
//Show error message of GetLastError()
void ShowSystemError()
{
    LPVOID lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR)&lpMsgBuf,
        0,
        NULL
        );
    MessageBox(NULL, lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION);
    LocalFree(lpMsgBuf);
}
「已注销」 2014-02-18
  • 打赏
  • 举报
回复
VS2013 默认是 Unicode 编码的,你 CreateFile 调用的是 CreateFileW 自然路径就是错误的。你直接用 CreateFileA 就行,argv 就是 ANSI 编码。
boyanglee 2014-02-16
  • 打赏
  • 举报
回复
发现是编码问题,从楼上对话框标题乱码得出的灵感。 因为我可以创建文件,但是文件名也是乱码,我使用硬编码,将两个CreateFile改为
hIn = CreateFile(TEXT("a.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
...
hOut = CreateFile(TEXT("b.txt"), FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
可以正常复制a.txt为b.txt 但是我想反问argv参数啊
boyanglee 2014-02-16
  • 打赏
  • 举报
回复
引用 11 楼 Worcy_kiddy 的回复:
我在我的机器上试了,没问题,你的D盘下面没有b.txt文件,所以会提示找不到文件!
请问你的机器运行环境 我是想实现 copy a.txt b.txt 这样的功能的 在当前目录下复制a.txt 为 b.txt
boyanglee 2014-02-16
  • 打赏
  • 举报
回复
引用 12 楼 jianwen0529 的回复:
路径问题+1 你看看你那个文件是否在D:/目录下,不是的话那就是相对路径惹的祸了吧!!
我dir *.txt 是在的啊 我想实现 copy a.txt b.txt 这样的功能的
xiaohuh421 2014-02-11
  • 打赏
  • 举报
回复
引用 5 楼 Worcy_kiddy 的回复:
你那个是A.txt.txt,你打开a.txt文件对麽?看看文件的扩展名~
眼睛好尖哟
zgl7903 2014-02-11
  • 打赏
  • 举报
回复
使用绝对路径或用GetModuleFileName构造出绝对路径
BombZhang 2014-02-11
  • 打赏
  • 举报
回复
5楼说得对 你的文件实际是A.txt.txt,你要打开的是a.txt,当然打不开了。 估计是电脑设置为隐藏文件扩展名了,所以你眼睛看到的文件是A.txt
幻夢之葉 2014-02-11
  • 打赏
  • 举报
回复
如果绝对路径还是有问题(还有你看你对话框的标题是乱码) 查下命令行参数读取的字符编码跟CreateFile的第一个参数是否匹配,不匹配则转换为一样!
幻夢之葉 2014-02-11
  • 打赏
  • 举报
回复
路径问题+1 你看看你那个文件是否在D:/目录下,不是的话那就是相对路径惹的祸了吧!!
boyanglee 2014-02-11
  • 打赏
  • 举报
回复
绝对路径也试过了... 我用两个printf测试了argv的值 还有请看截图 我之前有dir *.txt过 a.txt是存在的

相同的代码在xp+vs2010是可以正常使用的

MSDN回答如下图所示


还是不懂怎么解决
黑泡泡选手 2014-02-11
  • 打赏
  • 举报
回复
我在我的机器上试了,没问题,你的D盘下面没有b.txt文件,所以会提示找不到文件!
boyanglee 2014-02-11
  • 打赏
  • 举报
回复
#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 | GENERIC_WRITE, 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;
}

hOut = CreateFile(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE)
{
printf("Cannot open input file. Error: %x\n", GetLastError());
CloseHandle(hIn);
return 3;
}

while (ReadFile(hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
{
WriteFile(hOut, buffer, nIn, &nOut, NULL);
if (nIn != nOut)
{
printf("Fatal write error: %x\n", GetLastError());
CloseHandle(hIn);
CloseHandle(hOut);
return 4;
}
}

CloseHandle(hIn);
CloseHandle(hOut);

return 0;
}

//Show error message of GetLastError()
void ShowSystemError()
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, (LPCWSTR)"Error", MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}


boyanglee 2014-02-11
  • 打赏
  • 举报
回复
引用 5 楼 Worcy_kiddy 的回复:
你那个是A.txt.txt,你打开a.txt文件对麽?看看文件的扩展名~
不好意思 文件名弄错了 但是问题还是存在的 我重新上传图片 并把完整的代码贴上来 我是实现类似copy命令的用法
黑泡泡选手 2014-02-11
  • 打赏
  • 举报
回复
你那个是A.txt.txt,你打开a.txt文件对麽?看看文件的扩展名~
许文君 2014-02-11
  • 打赏
  • 举报
回复
同上,怀疑相对路径的问题,试试使用绝对路径
oyljerry 2014-02-10
  • 打赏
  • 举报
回复
OPEN_EXISTING 你打开的文件不存在,所以失败了
Eleven 2014-02-10
  • 打赏
  • 举报
回复
改用绝对路径试试

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧