Getting absolute path of a file

前端 未结 4 1052
说谎
说谎 2020-11-27 05:52

How can I convert a relative path to an absolute path in C on Unix? Is there a convenient system function for this?

On Windows there is a GetFullPathName

相关标签:
4条回答
  • 2020-11-27 06:18

    There is also a small path library cwalk which works cross-platform. It has cwk_path_get_absolute to do that:

    #include <cwalk.h>
    #include <stdio.h>
    #include <stddef.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      char buffer[FILENAME_MAX];
    
      cwk_path_get_absolute("/hello/there", "./world", buffer, sizeof(buffer));
      printf("The absolute path is: %s", buffer);
    
      return EXIT_SUCCESS;
    }
    

    Outputs:

    The absolute path is: /hello/there/world
    
    0 讨论(0)
  • 2020-11-27 06:22

    Also try "getcwd"

    #include <unistd.h>
    
    char cwd[100000];
    getcwd(cwd, sizeof(cwd));
    std::cout << "Absolute path: "<< cwd << "/" << __FILE__ << std::endl;
    

    Result:

    Absolute path: /media/setivolkylany/WorkDisk/Programming/Sources/MichailFlenov/main.cpp
    

    Testing environment:

    setivolkylany@localhost$/ lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux 8.6 (jessie)
    Release:    8.6
    Codename:   jessie
    setivolkylany@localhost$/ uname -a
    Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
    setivolkylany@localhost$/ g++ --version
    g++ (Debian 4.9.2-10) 4.9.2
    Copyright (C) 2014 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    0 讨论(0)
  • 2020-11-27 06:27

    Use realpath().

    The realpath() function shall derive, from the pathname pointed to by file_name, an absolute pathname that names the same file, whose resolution does not involve '.', '..', or symbolic links. The generated pathname shall be stored as a null-terminated string, up to a maximum of {PATH_MAX} bytes, in the buffer pointed to by resolved_name.

    If resolved_name is a null pointer, the behavior of realpath() is implementation-defined.


    The following example generates an absolute pathname for the file identified by the symlinkpath argument. The generated pathname is stored in the actualpath array.

    #include <stdlib.h>
    ...
    char *symlinkpath = "/tmp/symlink/file";
    char actualpath [PATH_MAX+1];
    char *ptr;
    
    
    ptr = realpath(symlinkpath, actualpath);
    
    0 讨论(0)
  • 2020-11-27 06:29

    Try realpath() in stdlib.h

    char filename[] = "../../../../data/000000.jpg";
    char* path = realpath(filename, NULL);
    if(path == NULL){
        printf("cannot find file with name[%s]\n", filename);
    } else{
        printf("path[%s]\n", path);
        free(path);
    }
    
    0 讨论(0)
提交回复
热议问题