【问题标题】:Rename Windows folders in C++在 C++ 中重命名 Windows 文件夹
【发布时间】: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


    【解决方案1】:

    除非您的文件夹名称包含国际字符,否则您实际上可以使用 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 开发人员都使用宽字符。
    • @CodeAngry:回复“不是WCHARfriendly”,不,我没有这么说。为了确定我是否说过,只需阅读此评论序列上方的答案即可。关于“这些天”,在 16 位 Windows 之后一直如此,即自 NT 3.x cirka 1992 以来。关于“任何 Windows 开发人员默认使用宽字符”,这就是现在,在我为它争论不休之后年数。总之,作为对此答案的评论,我发现您的评论毫无意义。
    • 蹩脚的例子。不必要的尾随返回类型规范。 'fail' 可能无法编译,因为它不返回值。
    • @Ajay:请引用关于非void 函数必须返回的要求的标准(我想你会发现没有这样的要求,但如果你这样做会很有趣找一个)。请注意,添加一个虚拟的return 语句可能会使用智能编译器产生代码未到达警告。
    • @Cheersandhth.-Alf,哦!因此,在您看来,缺少“return”声明是可以的,但使用华丽的-&gt; int 很好!那么快乐编码!
    【解决方案2】:

    重命名一次的操作见MSDN上的MoveFile或MoveFileEx:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您需要使用MoveFile()

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

        【讨论】:

        • “需要使用”的声明应该有证据证明为什么不能使用std::rename
        • @Cheersandhth.-Alf 因为他只要求 Windows C++ 解决方案。所以我跳过了标准层,直接去API函数。这就是我们平台特定人员的滚动方式。
        • “需要使用”的声明应该有证据支持为什么不能使用std::rename,即使你认为很明显需要使用特定于平台的功能才能获得特定于平台的解决方案。
        • @Cheersandhth.-Alf:我可能是错的,但我不认为“需要使用”的字面意思是“这是唯一可行的方法”。
        猜你喜欢
        • 2017-06-09
        • 2015-12-03
        • 1970-01-01
        • 2012-09-03
        • 2011-06-21
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多