• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ pobieranie ścieżki bezwględnej

Object Storage Arubacloud
0 głosów
450 wizyt
pytanie zadane 15 sierpnia 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)
zamknięte 15 sierpnia 2020 przez Nabuchadonozor

Serwus forumowicze,

napotkał mnie pewien problem, dotyczący mojej niewiedzy. Otóż już przeszukałem tyle internetu, odnośnie tego jak pobrać ścieżkę bezwzględną do zmiennej i w końcu prawie straciłem nadzieję. Ostatnią szansą jesteście Wy. Moje pytanie, czy wie ktoś może, jakim sposobem można pobrać ścieżkę bezwzględną programu tak, aby zapisać ją do zmiennej?

Potrzebuję tej wiedzy do takiego kodu:

#include <iostream>
#include <unistd.h>

using namespace std;

int main()
{
    int result;

    const char* fileName = "X:/CB projects/test/folder";

    if(access(fileName, F_OK)==0) cout << "istnieje";


    return 0;
}

Powyższy kod działa, ino problem w tym, że jak ktoś przerzuci program z jednego miejsca na drugi, to wtedy już ścieżka się zmieni, a chcę, by za każdym razem pobierało "ścieżkę bezwzględną + /folder". Liczę na Was :)

komentarz zamknięcia: Odpuszczam, to co jest napisane w komentarzach nie jest dla mnie ani trochę zrozumiałe. Dziękuję za chęci :)
komentarz 15 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)

https://en.cppreference.com/w/cpp/filesystem/current_path

Więcej cierpliwości, 3h na odpowiedź, to bardzo mało czasu, zwłaszcza w sobotę o 13...

2 odpowiedzi

0 głosów
odpowiedź 15 sierpnia 2020 przez Oscar Nałogowiec (29,320 p.)
Zerowy argument wywołania programu to jego nazwa. W zależności od sposobu uruchomienia (z konsoli ze ścieżki, z podaniem pełnej ścieżki, z GUI) jest tam różna wartość, ale ta informacja plus dane środowiska (zmienna PATH i aktualny katalog) można odtworzyć pełną ścieżkę do uruchomionego programu.
0 głosów
odpowiedź 15 sierpnia 2020 przez VBService Ekspert (254,570 p.)
edycja 15 sierpnia 2020 przez VBService

SOLUTION 4: [ źródło ]

Isolating platform specific code with #ifdefs.

The other type would be to have clean #ifdef-less header wich contains function declarations and put the implementations in platform specific source files. For example, check out how Poco C++ library does something similar for their Environment class.

 

SOLUTION 5:

  • This code finds the executable's path in Windows, Linux, MacOS, Solaris or FreeBSD.
  • To simplify the code but it's easy enough to remove.
  • To use defines like _MSC_VER and __linux as the OS and compiler require.

 

#include <string>
#include <boost/predef/os.h>

#if (BOOST_OS_WINDOWS)
#  include <stdlib.h>
#elif (BOOST_OS_SOLARIS)
#  include <stdlib.h>
#  include <limits.h>
#elif (BOOST_OS_LINUX)
#  include <unistd.h>
#  include <limits.h>
#elif (BOOST_OS_MACOS)
#  include <mach-o/dyld.h>
#elif (BOOST_OS_BSD_FREE)
#  include <sys/types.h>
#  include <sys/sysctl.h>
#endif

/*
 * Returns the full path to the currently running executable,
 * or an empty string in case of failure.
 */
std::string getExecutablePath() {
#if (BOOST_OS_WINDOWS)
    char *exePath;
    if (_get_pgmptr(&exePath) != 0)
        exePath = "";
#elif (BOOST_OS_SOLARIS)
    char exePath[PATH_MAX];
    if (realpath(getexecname(), exePath) == NULL)
        exePath[0] = '\0';
#elif (BOOST_OS_LINUX)
    char exePath[PATH_MAX];
    ssize_t len = ::readlink("/proc/self/exe", exePath, sizeof(exePath));
    if (len == -1 || len == sizeof(exePath))
        len = 0;
    exePath[len] = '\0';
#elif (BOOST_OS_MACOS)
    char exePath[PATH_MAX];
    uint32_t len = sizeof(exePath);
    if (_NSGetExecutablePath(exePath, &len) != 0) 
    {
        exePath[0] = '\0'; // buffer too small (!)
    } else
    {
        // resolve symlinks, ., .. if possible
        char *canonicalPath = realpath(exePath, NULL);
        if (canonicalPath != NULL) 
        {
            strncpy(exePath,canonicalPath,len);
            free(canonicalPath);
        }
    }
#elif (BOOST_OS_BSD_FREE)
    char exePath[2048];
    int mib[4];  mib[0] = CTL_KERN;  mib[1] = KERN_PROC;  mib[2] = KERN_PROC_PATHNAME;  mib[3] = -1;
    size_t len = sizeof(exePath);
    if (sysctl(mib, 4, exePath, &len, NULL, 0) != 0)
        exePath[0] = '\0';
#endif
    return std::string(exePath);
}

 

The above version returns full paths including the executable name. If instead we want the path without the executable name, <#include boost/filesystem.hpp> and change the return statement :

 

return strlen(exePath)>0 ? boost::filesystem::path(exePath).remove_filename().make_preferred().string() : std::string();

P.S. Podałem interesujący fragment z tej strony, ponieważ strona zawiera agresywne reklamy google ads, bardzo nie wygodne jest "poruszanie" się po niej, włączenie adblock, powoduje brak dostępu do content-u strony (jedynie wyłączenie obsługi javascript dla tej strony, przed jej pełnym "załadowaniem" - pomogło) wink

Podobne pytania

0 głosów
1 odpowiedź 96 wizyt
pytanie zadane 8 października 2020 w C i C++ przez FaloY Bywalec (2,180 p.)
0 głosów
2 odpowiedzi 654 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez smokolisz Mądrala (6,340 p.)
+1 głos
2 odpowiedzi 364 wizyt

92,690 zapytań

141,603 odpowiedzi

320,098 komentarzy

62,050 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...