在C++中重命名Windows文件夹

Rename Windows folders in C++

本文关键字:Windows 文件夹 重命名 C++      更新时间:2023-10-16

我想知道是否有一种用C++编程的简单方法——重命名Windows文件夹。

我想制作的程序是这样的:

rename folder "Something A" to "Something TEMP"
rename folder "Something B" to "Something A"
rename folder "Something TEMP" to "Something B"

您需要使用MoveFile()

我知道这听起来很有趣,但它也适用于目录。:)

有关重命名一次的操作,请参阅MSDN上的MoveFile或MoveFileEx:

BOOL WINAPI MoveFile(
_In_  LPCTSTR lpExistingFileName,
_In_  LPCTSTR lpNewFileName
);

除非文件夹的名称带有国际字符,否则您实际上可以从<stdio.h>标头使用C标准库的::rename函数,例如:

#include <stdio.h>      // ::rename
#include <stdlib.h>     // ::exit, EXIT_FAILURE
auto fail( char const* const message )
-> bool
{
fprintf( stderr, "!%sn", 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"短名称"–在这种情况下为什么要使用CCD_ 5。

  • 现代Windows程序通常面向宽字符,这意味着转换为ANSI字符编码,这很不方便。

对于您的用例来说,这些问题可能都不存在,但如果存在,那么只需使用MoveFileAPI函数,正如其他答案中已经提到的那样。

或者,如果使用boost,则可以使用:

std::string name("old_dir");
std::string new_name("new_dir");
system::error_code ec = boost::filesystem::rename(name, new_name);