Технические вопросы и ответы QA1549

Расширение Основанных на тильде путей

Q: Как я разворачиваю основанный на тильде путь к его значению полного пути?

A: Как я разворачиваю основанный на тильде путь к его значению полного пути?

Некоторые ситуации могут возникнуть, где требуется развернуть основанный на тильде соответствующий тракт в разрешенный, абсолютный путь. Например, «~ /» мог бы решить к «/users/johndoe». Вот примеры того, как выполнить эту задачу под каждой средой разработки (Objective C, POSIX и Базовая Основа).

  Objective C перечисления 1 (результат автовыпущен),

NSString *result = [@"~/Desktop" stringByExpandingTildeInPath];

Перечисление 2  POSIX (вызывающая сторона, ответственная за освобождение результата)

#include <glob.h>

char* CreatePathByExpandingTildePath(char* path)
{
    glob_t globbuf;
    char **v;
    char *expandedPath = NULL, *result = NULL;

    assert(path != NULL);

    if (glob(path, GLOB_TILDE, NULL, &globbuf) == 0) //success
    {
        v = globbuf.gl_pathv; //list of matched pathnames
        expandedPath = v[0]; //number of matched pathnames, gl_pathc == 1

        result = (char*)calloc(1, strlen(expandedPath) + 1); //the extra char is for the null-termination
        if(result)
            strncpy(result, expandedPath, strlen(expandedPath) + 1); //copy the null-termination as well

        globfree(&globbuf);
    }

    return result;
}

  Основа Ядра перечисления 3 (вызывающая сторона, ответственная за выпуск результата)

#include <glob.h>

// This is the POSIX version in listing 2.
char*  CreatePathByExpandingTildePath(char* path);

CFStringRef CreateCFStringByExpandingTildePath(CFStringRef path)
{
    char pcPath[PATH_MAX];
    char *pcResult = NULL;
    CFStringRef result = NULL;

    if (CFStringGetFileSystemRepresentation(path, pcPath, PATH_MAX)) //CFString to CString
    {
        pcResult = CreatePathByExpandingTildePath(pcPath); //call the POSIX version
        if (pcResult)
        {
            result = CFStringCreateWithCString(NULL, pcResult, kCFStringEncodingUTF8); //CString to CFString
            free(pcResult); //free the memory allocated in CreatePathByExpandingTildePath()
        }
    }

    return result;
}


История версии документа


ДатаПримечания
08.09.2008

Упрощенный POSIX и версии CF с помощью встроенного шарика () функция.

24.09.2007

Новый документ, демонстрирующий, как разрешить основанные на тильде соответствующие тракты.