【发布时间】:2014-04-04 18:40:54
【问题描述】:
我想知道是否有一种用 C++ 编程重命名 Windows 文件夹的简单方法。
我想做的程序是这样的:
rename folder "Something A" to "Something TEMP"
rename folder "Something B" to "Something A"
rename folder "Something TEMP" to "Something B"
【问题讨论】:
我想知道是否有一种用 C++ 编程重命名 Windows 文件夹的简单方法。
我想做的程序是这样的:
rename folder "Something A" to "Something TEMP"
rename folder "Something B" to "Something A"
rename folder "Something TEMP" to "Something B"
【问题讨论】:
除非您的文件夹名称包含国际字符,否则您实际上可以使用 C standard library's ::rename function,来自 <stdio.h> 标头,例如如下:
#include <stdio.h> // ::rename
#include <stdlib.h> // ::exit, EXIT_FAILURE
auto fail( char const* const message )
-> bool
{
fprintf( stderr, "!%s\n", message );
exit( EXIT_FAILURE );
}
auto main()
-> int
{
rename( "a", "temp" )
== 0
|| fail( "Renaming a failed." );
rename( "b", "a" )
== 0
|| fail( "Renaming b failed." );
rename( "temp", "b" )
== 0
|| fail( "Renaming temp failed." );
}
这也适用于其他操作系统。
限制/潜在问题:
C 标准没有明确声明rename 也适用于文件夹。我猜那是因为 C 起源于 Unix,而在 Unix 中,文件夹就是一个文件。在 Windows 中,文件夹的文件性质通过普通访问方式隐藏。
rename 没有宽字符变体,因此在 Windows 中它通常无法处理具有国际字符的文件夹,除非您使用 Windows API 函数首先获取纯 ASCII “短名称”——在这种情况下,为什么要使用 rename。
现代 Windows 程序通常是面向宽字符的,这意味着向下转换为 ANSI 字符编码,这很不方便。
您的用例可能不存在这些问题,但如果有任何问题,则只需使用the MoveFile API function,正如其他答案中已经提到的那样。
【讨论】:
WCHAR不友好吗?你问我为什么说他needs to use?您知道*A() 函数参数在使用之前在内部转换为wide。默认情况下,任何 Windows 开发人员都使用宽字符。
WCHARfriendly”,不,我没有这么说。为了确定我是否说过,只需阅读此评论序列上方的答案即可。关于“这些天”,在 16 位 Windows 之后一直如此,即自 NT 3.x cirka 1992 以来。关于“任何 Windows 开发人员默认使用宽字符”,这就是现在,在我为它争论不休之后年数。总之,作为对此答案的评论,我发现您的评论毫无意义。
void 函数必须返回的要求的标准(我想你会发现没有这样的要求,但如果你这样做会很有趣找一个)。请注意,添加一个虚拟的return 语句可能会使用智能编译器产生代码未到达警告。
-> int 很好!那么快乐编码!
重命名一次的操作见MSDN上的MoveFile或MoveFileEx:
BOOL WINAPI MoveFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName
);
【讨论】:
或者,如果你使用boost,你可以使用:
std::string name("old_dir");
std::string new_name("new_dir");
system::error_code ec = boost::filesystem::rename(name, new_name);
【讨论】:
您需要使用MoveFile()。
我知道这听起来很有趣,但它也适用于目录。 :)
【讨论】:
std::rename。
std::rename,即使你认为很明显需要使用特定于平台的功能才能获得特定于平台的解决方案。