2014-11-02 147 views
0

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

很明显,编译器有变化,因为字符串函数必须升级到strcpy_s等。没问题。这是一个控制台应用程序。我从来没有将我的C++知识扩展到C++之上,因为我需要的不仅仅是能够编写小型的utils来在命令行上执行操作。尽管如此,我仍然可以写出一些复杂的工具。

我的问题是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的类型是什么,如果这是罪魁祸首。所以要编译我只需键入我的字符串。它编译。但它仍然不会移动文件。
代码在开发源变量的源代码中更为复杂,但我已将它简化为一个简单的“仅向文件名追加1”的情况,以查看我是否可以简单地重命名它。我认为C:\ xxx \ yyy \ zzz \ test.txt在某些方面可能是错误的,但是通过上面的测试,这个想法下降了。我已经完成了,没有。\同样的问题。除了让我自己的fileopen读/写二进制函数替换movefile()之外,我的想法已经用完了。我真的反对,但如果我必须,我会的。

编辑:我粘贴从原来的代码使用FullPathName的printf,我已经纠正了片段。

+0

你在任何常量字符串中使用单个反斜杠而不是两个连续反斜杠的机会?如果你希望用户能够在这里帮助你,那么你应该添加“在两个变量中放置字符串的代码”,以及“FullPathName”变量和“newfilename”变量的初始化题。 – 2014-11-02 14:55:44

+0

您需要将char *转换为WCHAR *'MoveFile((CA2W(source),CA2W(dest));'或使用'MoveFileA' – 2014-11-02 14:59:55

+0

@AlexFarber CA2W是ATL/MFC特有的,并且在VS Express版本中不可用 – 2014-11-02 15:03:53

回答

4

,你是铸造你的论点LPCWSTR的事实表明,你正在编译与UNICODE你的程序中定义,这意味着你在呼唤MoveFileW和编译器警告的参数类型不匹配。

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

实际的解决方案:

  1. 使用WCHARMoveFileW期望(或TCHAR/LPTSTR_T宏)。
  2. 明确呼叫MoveFileA
  3. 编译时没有定义UNICODE
+0

虽然不适用于非常量字符串(例如,通常是文件名),但请不要忘记Windows的LPTSTR类型和用于字符串文字的_T宏。 'LPTSTR name = _T(“constant”)'会根据'UNICODE'是否定义来做适当的事情。 – 2014-11-02 18:28:36

+1

谢谢,添加到答案。 – 2014-11-02 18:36:54

1

谢谢Andrew Medico。我使用MoveFileA,该程序似乎现在工作。
我不确定是否关闭了unicode,但我确实更改了属性中的一个项目。

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