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

时间:2011-04-19 04:13:54

标签: c++ visual-c++ dev-c++

我需要从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。

提前致谢。

7 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

重型和跨平台的方式是使用boost::filesystem::parent_path()。但显然这会增加你可能不想要的开销。

或者你可以使用cstring的 strrchr 这样的函数:

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

在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;
}

答案 4 :(得分:0)

在Windows平台上,您可以使用 PathRemoveFileSpecPathCchRemoveFileSpec 为达到这个。 但是为了便于携带,我会选择其他方法。

答案 5 :(得分:0)

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

setlocale(LC_ALL, 'en_US.utf8')

答案 6 :(得分:-2)

您可以使用dirname获取父目录 查看此link了解详情

Raghu