movefile()失败,错误2或123 我更新了一个C++例程来移动在VisualStudio Express 2008/2010中编写的文件。我现在正在运行VS Express 2012

movefile()失败,错误2或123 我更新了一个C++例程来移动在VisualStudio Express 2008/2010中编写的文件。我现在正在运行VS Express 2012,c++,C++,显然,编译器有一些变化,因为字符串函数必须升级到strcpy_等。没问题。这是一个控制台应用程序。我从不把C++知识扩展到C++,而不需要编写小的UTIL来在命令行上做事情。我仍然能够编写一些复杂的实用程序 我的问题是movefile()函数始终无法移动,出现错误2或123。我在C:\users\alan\downloads文件夹中工作,所以我知道我有权限。我知道档案在那里。代码的一小部分是: char source=".\\test.txt"; // edited for clarit

显然,编译器有一些变化,因为字符串函数必须升级到strcpy_等。没问题。这是一个控制台应用程序。我从不把C++知识扩展到C++,而不需要编写小的UTIL来在命令行上做事情。我仍然能够编写一些复杂的实用程序

我的问题是movefile()函数始终无法移动,出现错误2或123。我在C:\users\alan\downloads文件夹中工作,所以我知道我有权限。我知道档案在那里。代码的一小部分是:

char source=".\\test.txt";     // edited for clarity.
char dest=".\\test.txt1";
printf("\nMove\n    %s\n to %s\n",source,dest);   // just to see what is going on
MoveFile((LPCWSTR) source, (LPCWSTR) dest);
printf("Error %u\n",GetLastError());  
输出为: 移动 \test.txt 到。\test.txt1 错误2

我所有的字符串都是简单的字符字符串,即使在阅读之后,我也不确定LPCWSTR的def'd类型是什么,以及这是否是罪魁祸首。所以为了让它编译,我只需键入我的字符串。它编译。但它仍然无法移动文件。
在开发source&dest变量时,代码更加复杂,但我已经将其简化为一种简单的“只需在文件名中附加1”的情况,看看是否可以简单地重命名它。我认为C:\xxx\yyy\zzz\test.txt在某种程度上可能是错误的,但是这个想法在上面的测试中失败了。我做过同样的问题,也做过同样的问题。除了制作自己的fileopen读/写二进制函数来替换movefile()之外,我已经没有其他想法了。我真的很反对,但如果必须的话,我会的


编辑:我粘贴了使用FullPathName的原始代码的printf,我已更正了该代码段。

您将参数强制转换到
LPCWSTR
这一事实表明您正在使用定义的
UNICODE
编译程序,这意味着您正在调用
MoveFileW
,编译器警告说参数类型不匹配

插入强制转换并不能解决这一问题。您正在告诉编译器停止抱怨,但实际上还没有解决问题(底层数据仍然是错误的)

实际解决办法:

  • 使用
    WCHAR
    作为
    MoveFileW
    所需(或
    TCHAR
    /
    LPTSTR
    \T
    宏)
  • 显式调用
    MoveFileA
  • 在未定义UNICODE的情况下编译

  • 您将参数强制转换为
    LPCWSTR
    这一事实表明,您正在使用定义的
    UNICODE
    编译程序,这意味着您正在调用
    MoveFileW
    ,编译器警告参数类型不匹配

    插入强制转换并不能解决这一问题。您正在告诉编译器停止抱怨,但实际上还没有解决问题(底层数据仍然是错误的)

    实际解决办法:

  • 使用
    WCHAR
    作为
    MoveFileW
    所需(或
    TCHAR
    /
    LPTSTR
    \T
    宏)
  • 显式调用
    MoveFileA
  • 在未定义UNICODE的情况下编译

  • 谢谢Andrew Medico。我使用了MoveFileA,该程序现在似乎可以运行了。
    我不确定是否关闭了unicode,但我确实更改了属性中的一项


    我需要阅读有关unicode/ansi设置的编译器。但是现在这个问题已经解决了,我相信我已经知道我需要做什么了。“研究”

    谢谢安德鲁·梅迪科。我使用了MoveFileA,该程序现在似乎可以运行了。
    我不确定是否关闭了unicode,但我确实更改了属性中的一项


    我需要阅读有关unicode/ansi设置的编译器。但是现在这个问题已经解决了,我相信我已经知道我需要做什么了。“研究”

    有没有可能在任何常量字符串中使用单个反斜杠而不是两个连续的反斜杠?如果您希望用户能够在这里帮助您,那么您应该在问题中添加“将字符串放入两个变量的代码”,以及
    FullPathName
    变量和
    newfilename
    变量的初始化。您需要将char*转换为WCHAR*
    MoveFile((CA2W(源代码),CA2W(目标代码));
    或使用
    MoveFileA
    @AlexFarber CA2W是ATL/MFC特定的,在VS Express版本中不可用。您不能仅将单个字节转换为宽字符串。此外,还可以使用将Windows错误代码转换为描述性字符串。您还可以将.2表示“未找到文件”。123表示“文件名、目录名或卷标语法不正确。”“这让编译器闭嘴。那些编译器家伙太蠢了。他们甚至不知道如何将一个[函数]指针转换为另一个。我打赌他们上厕所时需要帮助擦屁股。”(via)是否有可能在任何常量字符串中使用单个反斜杠而不是两个连续的反斜杠?如果您希望用户能够在这里帮助您,那么您应该添加“将字符串放入两个变量的代码”,以及初始化
    FullPathName
    变量和
    newfilename
    变量。您需要将char*转换为WCHAR*
    MoveFile((CA2W(源),CA2W(目的));
    或使用
    MoveFileA
    @AlexFarber CA2W是ATL/MFC特定的,在VS Express版本中不可用。您不能仅将单个字节转换为宽字符串。此外,还可以使用将Windows错误代码转换为描述性字符串。您还可以将.2表示“未找到文件”。123表示“文件名、目录名或卷标语法不正确。”“这让编译器闭嘴了。那些编译器家伙太蠢了。他们甚至不知道如何将一个[函数]指针转换为另一个。我打赌他们在上厕所时需要帮助擦屁股。”(via)尽管不适用于非常量字符串(例如,通常是文件名),不要忘记Windows的
    LPT