从 C++ 中的文件获取父目录

发布于 2024-11-02 08:04:21 字数 414 浏览 4 评论 0原文

我需要从 C++ 中的文件获取父目录:

例如:

输入:

D:\Devs\Test\sprite.png

输出:

D:\Devs\Test\ [or D:\Devs\Test]

我可以使用函数来执行此操作:

char *str = "D:\\Devs\\Test\\sprite.png";
for(int i = strlen(str) - 1; i>0; --i)
{
    if( str[i] == '\\' )
    {
        str[i] = '\0';
        break;
    }
}

但是,我只想知道是否存在内置函数。 我用的是VC++2003。

I need to get parent directory from file in C++:

For example:

Input:

D:\Devs\Test\sprite.png

Output:

D:\Devs\Test\ [or D:\Devs\Test]

I can do this with a function:

char *str = "D:\\Devs\\Test\\sprite.png";
for(int i = strlen(str) - 1; i>0; --i)
{
    if( str[i] == '\\' )
    {
        str[i] = '\0';
        break;
    }
}

But, I just want to know there is exist a built-in function.
I use VC++ 2003.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

铃予 2024-11-09 08:04:21

如果您使用 std::string 而不是 C 风格的字符数组,则可以使用 string::find_last_ofstring::substr 在以下方式:

std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));

If you're using std::string instead of a C-style char array, you can use string::find_last_of and string::substr in the following manner:

std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));
提笔书几行 2024-11-09 08:04:21

现在,在 C++17 中可以使用 std::filesystem: :path::parent_path

    #include <filesystem>
    namespace fs = std::filesystem;

    int main() {
        fs::path p = "D:\\Devs\\Test\\sprite.png";
        std::cout << "parent of " << p << " is " << p.parent_path() << std::endl;
        // parent of "D:\\Devs\\Test\\sprite.png" is "D:\\Devs\\Test"

        std::string as_string = p.parent_path().string();
        return 0;
    }

Now, with C++17 is possible to use std::filesystem::path::parent_path:

    #include <filesystem>
    namespace fs = std::filesystem;

    int main() {
        fs::path p = "D:\\Devs\\Test\\sprite.png";
        std::cout << "parent of " << p << " is " << p.parent_path() << std::endl;
        // parent of "D:\\Devs\\Test\\sprite.png" is "D:\\Devs\\Test"

        std::string as_string = p.parent_path().string();
        return 0;
    }
上课铃就是安魂曲 2024-11-09 08:04:21

重型和跨平台方法是使用 boost::filesystem::parent_path()。但显然这会增加您可能不希望的开销。

或者,您可以使用 cstring 的 strrchr 函数像这样的东西:

include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';

Heavy duty and cross platform way would be to use boost::filesystem::parent_path(). But obviously this adds overhead you may not desire.

Alternatively you could make use of cstring's strrchr function something like this:

include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';
a√萤火虫的光℡ 2024-11-09 08:04:21

编辑 const 字符串是未定义的行为,因此声明如下所示:

char str[] = "D:\\Devs\\Test\\sprite.png";

您可以使用下面的 1 个衬垫来获得所需的结果:

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also

Editing a const string is undefined behavior, so declare something like below:

char str[] = "D:\\Devs\\Test\\sprite.png";

You can use below 1 liner to get your desired result:

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also
赠意 2024-11-09 08:04:21

在 POSIX 兼容系统 (*nix) 上,此 dirname(3) 有一个常用函数。在 Windows 上,有 _splitpath

_splitpath 函数中断路径
分为四个部分。

void _splitpath(
   const char *path,
   char *drive,
   char *dir,
   char *fname,
   char *ext 
);

所以结果(这就是我认为你正在寻找的)将在 dir 中。

这是一个例子:

int main()
{
    char *path = "c:\\that\\rainy\\day";
    char dir[256];
    char drive[8];
    errno_t rc;


    rc = _splitpath_s(
        path,       /* the path */
        drive,      /* drive */
        8,          /* drive buffer size */
        dir,        /* dir buffer */
        256,        /* dir buffer size */
        NULL,       /* filename */
        0,          /* filename size */
        NULL,       /* extension */
        0           /* extension size */
    );

    if (rc != 0) {
        cerr << GetLastError();
        exit (EXIT_FAILURE);
    }

    cout << drive << dir << endl;
    return EXIT_SUCCESS;
}

On POSIX-compliant systems (*nix) there is a commonly available function for this dirname(3). On windows there is _splitpath.

The _splitpath function breaks a path
into its four components.

void _splitpath(
   const char *path,
   char *drive,
   char *dir,
   char *fname,
   char *ext 
);

So the result (it's what I think you are looking for) would be in dir.

Here's an example:

int main()
{
    char *path = "c:\\that\\rainy\\day";
    char dir[256];
    char drive[8];
    errno_t rc;


    rc = _splitpath_s(
        path,       /* the path */
        drive,      /* drive */
        8,          /* drive buffer size */
        dir,        /* dir buffer */
        256,        /* dir buffer size */
        NULL,       /* filename */
        0,          /* filename size */
        NULL,       /* extension */
        0           /* extension size */
    );

    if (rc != 0) {
        cerr << GetLastError();
        exit (EXIT_FAILURE);
    }

    cout << drive << dir << endl;
    return EXIT_SUCCESS;
}
云胡 2024-11-09 08:04:21

在 Windows 平台上,您可以使用
PathRemoveFileSpec 或 < a href="https://msdn.microsoft.com/en-us/library/windows/desktop/hh707092(v=vs.85).aspx" rel="nofollow noreferrer">PathCchRemoveFileSpec
为了实现这一点。
然而,为了可移植性,我会采用此处建议的其他方法。

On Windows platforms, you can use
PathRemoveFileSpec or PathCchRemoveFileSpec
to achieve this.
However for portability I'd go with the other approaches that are suggested here.

晨与橙与城 2024-11-09 08:04:21

您可以使用 dirname 来获取父目录
检查此链接了解更多信息

Raghu

You can use dirname to get the parent directory
Check this link for more info

Raghu

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文