Получить родительский каталог из файла в C ++ - PullRequest
5 голосов
/ 19 апреля 2011

Мне нужно получить родительский каталог из файла в 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.

Заранее спасибо.

Ответы [ 6 ]

11 голосов
/ 19 апреля 2011

Если вы используете std :: string вместо массива символов стиля C, вы можете использовать string :: find_last_of и string :: substr следующим образом:

std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));
4 голосов
/ 19 апреля 2011

Сверхпрочный и кроссплатформенный способ - использовать boost :: filesystem :: parent_path () . Но очевидно, что это добавляет накладных расходов, которые вы можете не желать.

В качестве альтернативы вы можете использовать функцию cstring strrchr примерно так:

include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';
1 голос
/ 19 апреля 2011

В POSIX-совместимых системах (* nix) для этого dirname(3) есть общедоступная функция. На окнах есть _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;
}
1 голос
/ 19 апреля 2011

Редактирование константной строки - неопределенное поведение, поэтому объявите что-то вроде ниже:

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

Вы можете использовать ниже 1 вкладыш, чтобы получить желаемый результат:

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also
0 голосов
/ 30 августа 2017

На платформах Windows вы можете использовать PathRemoveFileSpec или PathCchRemoveFileSpec для достижения этой цели. Однако для мобильности я бы пошел с другими подходами, которые предлагаются здесь.

0 голосов
/ 19 апреля 2011

Вы можете использовать dirname, чтобы получить родительский каталог Проверьте эту ссылку для получения дополнительной информации

Raghu

...