C++ 根据文件路径获取它的目录

举报
福州司马懿 发表于 2024/10/30 10:15:23 2024/10/30
【摘要】 在 C++ 中,如果你有一个使用 TCHAR[] 存储的文件路径,并且你希望获取该路径的目录部分,你可以使用 Windows API 函数 _tsplitpath 和 _tmakepath 来实现这一点。这些函数是 tchar.h 头文件的一部分,并且会根据你的项目设置(ANSI 或 Unicode)自动选择正确的版本。以下是一个示例代码,展示了如何获取 TCHAR[] 路径的目录部分:#i...

在 C++ 中,如果你有一个使用 TCHAR[] 存储的文件路径,并且你希望获取该路径的目录部分,你可以使用 Windows API 函数 _tsplitpath_tmakepath 来实现这一点。这些函数是 tchar.h 头文件的一部分,并且会根据你的项目设置(ANSI 或 Unicode)自动选择正确的版本。

以下是一个示例代码,展示了如何获取 TCHAR[] 路径的目录部分:

#include <windows.h>
#include <tchar.h>
#include <iostream>

void GetDirectoryFromPath(const TCHAR* path, TCHAR* directory, size_t directorySize) {
    // Variables to hold the split components of the path
    TCHAR drive[_MAX_DRIVE];
    TCHAR dir[_MAX_DIR];
    TCHAR fname[_MAX_FNAME];
    TCHAR ext[_MAX_EXT];

    // Split the path into its components
    _tsplitpath(path, drive, dir, fname, ext);

    // Combine the drive and directory parts to form the full directory path
    _tmakepath(directory, drive, dir, NULL, NULL);

    // Ensure the directory ends with a backslash (if it's not the root)
    size_t len = _tcslen(directory);
    if (len > 0 && directory[len - 1] != _T('\\')) {
        if (len < directorySize - 1) {
            _tcscat(directory, _T("\\"));
        } else {
            // Buffer is too small to add backslash
            // Handle error or truncate as needed
            directory[directorySize - 1] = _T('\0');
        }
    }
}

int main() {
    // Example path
    TCHAR path[] = _T("C:\\Users\\Example\\Documents\\file.txt");
    TCHAR directory[_MAX_PATH];

    // Get the directory part of the path
    GetDirectoryFromPath(path, directory, _MAX_PATH);

    // Print the directory
    _tprintf(_T("Directory: %s\n"), directory);

    return 0;
}

说明:

  1. 包含头文件

    • #include <windows.h>:包含 Windows API 的定义。
    • #include <tchar.h>:包含 TCHAR 类型的定义和 _tsplitpath_tmakepath 函数。
    • #include <iostream>:用于控制台输出(尽管在这个例子中我们使用的是 _tprintf)。
  2. GetDirectoryFromPath 函数

    • 接收一个 TCHAR 类型的路径和一个用于存储目录的 TCHAR 数组,以及该数组的大小。
    • 使用 _tsplitpath 将路径分割为驱动器、目录、文件名和扩展名。
    • 使用 _tmakepath 将驱动器和目录部分重新组合成完整的目录路径。
    • 确保目录字符串以反斜杠结尾(除非它是根目录)。
  3. main 函数

    • 定义一个示例路径。
    • 调用 GetDirectoryFromPath 函数获取目录部分。
    • 使用 _tprintf 打印目录。

注意事项:

  • _MAX_PATH 是一个预定义的常量,表示路径的最大长度。
  • _tsplitpath_tmakepath 是处理 TCHAR 字符串的泛型函数,会根据项目设置处理 ANSI 或 Unicode 字符串。
  • 确保目标数组 directory 足够大以存储结果字符串。在这个例子中,我们使用 _MAX_PATH 来确保足够的空间。

这种方法在 Windows 平台上非常有效,但如果你需要跨平台解决方案,可能需要考虑使用 Boost.Filesystem 或 C++17 的 <filesystem> 库。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。