本帖最后由 boyanglee 于 2014-02-10 22:31:45 编辑

解决方案 »

  1.   

    OPEN_EXISTING
    你打开的文件不存在,所以失败了
      

  2.   

    使用绝对路径或用GetModuleFileName构造出绝对路径
      

  3.   

    你那个是A.txt.txt,你打开a.txt文件对麽?看看文件的扩展名~
      

  4.   

    绝对路径也试过了... 我用两个printf测试了argv的值 还有请看截图 我之前有dir *.txt过 a.txt是存在的相同的代码在xp+vs2010是可以正常使用的MSDN回答如下图所示
    还是不懂怎么解决
      

  5.   

    5楼说得对你的文件实际是A.txt.txt,你要打开的是a.txt,当然打不开了。
    估计是电脑设置为隐藏文件扩展名了,所以你眼睛看到的文件是A.txt
      

  6.   


    不好意思 文件名弄错了 但是问题还是存在的 我重新上传图片 并把完整的代码贴上来我是实现类似copy命令的用法
      

  7.   

    #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);
    }
      

  8.   

    我在我的机器上试了,没问题,你的D盘下面没有b.txt文件,所以会提示找不到文件!
      

  9.   

    如果绝对路径还是有问题(还有你看你对话框的标题是乱码)
    查下命令行参数读取的字符编码跟CreateFile的第一个参数是否匹配,不匹配则转换为一样!
      

  10.   

    我dir *.txt 是在的啊我想实现 copy a.txt b.txt 这样的功能的
      

  11.   


    请问你的机器运行环境 我是想实现 copy a.txt b.txt 这样的功能的在当前目录下复制a.txt 为 b.txt
      

  12.   

    发现是编码问题,从楼上对话框标题乱码得出的灵感。
    因为我可以创建文件,但是文件名也是乱码,我使用硬编码,将两个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参数啊
      

  13.   

    VS2013 默认是 Unicode 编码的,你 CreateFile 调用的是 CreateFileW 自然路径就是错误的。你直接用 CreateFileA 就行,argv 就是 ANSI 编码。
      

  14.   

    帮你简单改了下:
    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);
    }