none
Relativní cesta k souboru

    Dotaz

  • Zdravím,

    Měl bych na dotaz (C++, MFC, Dialog):
    Pomocí GetCurrentDirectory() jsem si zjistil cestu ke spouštěnému souboru, potřeboval bych ji ale ještě rozšířit o zbytek cesty k souboru (podřízené složky) a název souboru. Nemůžu ale zadat absolutní cestu, protože se program bude spouštět z CD.

    void Sekce01b::OnBnClickedMfcbutton1()
    {
    	TCHAR path[MAX_PATH];
    		GetCurrentDirectory (MAX_PATH, path);
    		
    	ShellExecuteA(0, 0, "iexplore.exe", path + "cesta\název souboru.pdf" ,0, SW_SHOW);
    }
    Jakým způsobem bych měl na sebe navázat tyto dvě části cesty? Nebo existuje nějaký jiný způsob, jak tuto cestu zadat? Už jsem zkoušel "./" a podobně, ale vždy mi to akorát spustí okno prohlížeče a v něm vyhledávání zadané "cesty". (pokud by to bylo možné, prosil bych vložit kód)

    Děkuji

    neděle 13. května 2012 19:52

Odpovědi

Všechny reakce

  • DD,

    znaky "\" musí být zdvojené. Nevím jestli proměnná path obsahuje na konci znak "\". Pokud ne, musíš ho doplnit.

    http://support.microsoft.com/kb/224816

    msdn.microsoft.com/cs-cz/library/system.io.directory.getcurrentdirectory.aspx#Y537


    JCH

    • Upravený Jan Chaloupek neděle 13. května 2012 21:07
    • Označen jako odpověď AmarLite pondělí 14. května 2012 8:57
    neděle 13. května 2012 21:03
  • Zdravím,

    měl bych k tomu ještě dva, možná trochu hloupé, dotazy:

    1. Jakým způsobem bych měl doplnit do proměnné "\" A měl bych tam doplnit "\" nebo "/", protože všude jinde jsou v proměnné "/"?
    2. Jakým způsobe bych měl napojit "path" se zbytkem cesty? Protože předpokládám, že samotné "+" to nebude...

    Děkuji

    pondělí 14. května 2012 4:40
  • Dobrý den,

    jsi si jistý, že jsi se něco z programování už naučil? Toto jsou úplné základy programování v jayzce C (C++).

    ad1)     Doplň ho ručně do toho zbytku cesty ať nemusíš provádět další "sečítání" stringů.

    "\\Cesta\\NázevSouboru.pdf"

    Všechny nové programy si už budou umět poradit s oběma znaky ('\' i '/'). Na linuxu je správné '/' a ve Windows '\'. Nevýhoda znaku '\' je nutnost jeho zdvojování při ručním zápisu do kódu (je to speciální znak).

    http://physics.ujep.cz/~mmaly/vyuka/oporaPrgB/016.html

    .

    ad2)     V programovacím jazyce C je na spojování řetězců nativní funkce strcat(). V C++ navíc přetížený operátor+ funguje i na spojování stringů, takže tak jak jsi to měl napsané by to mohlo také fungovat. Záleží na definované velikosti proměnných.

    Například tady: http://www.abclinuxu.cz/poradna/programovani/show/240006

    .

    .

    PS: Ještě si dej pozor na douhé názvy souborů (s mezerami). Buď je vůbec nepoužívej, nebo to budeš muset obejít vnitřním zadáním apastrofu na začátek a konec názvu souboru. Jinak se ti jeden parametr s názvem souboru s mezerou rozpadne na 2 parametry.

    Například:

    notepad.exe dlouhý název souboru.txt

    se pokusí otevřít 3 soubory: "dlouhý", "název" a "souboru.txt"

    Musel by jsi použít buď

    notepad.exe DlouhýNázevSouboru.txt

    (tj. vyhnout se názvům s mezerami - pokud to jde) nebo

    notepad.exe 'Dlouhý Název Souboru.txt'

    JCH

    pondělí 14. května 2012 6:03
  • Ještě jednou zdravím,

    něco podobného už jsem tam měl zadané, ale tím se dostávám k tomuto problému:


    A závorky tomu nepomohly. Jakým způsobem by se to dalo vyřešit?

    Děkuji

    PS: Tím, kolik toho v C/C++ umím si taky moc jistý nejsem, protože obvykle píšu v C# nebo VB


    • Upravený AmarLite pondělí 14. května 2012 7:30 Doplnění
    pondělí 14. května 2012 7:29
  • Já bych to přepsal takto:

    TCHAR file_path[MAX_PATH];
    TCHAR run_exe[MAX_PATH;
    
    GetCurrentDirectoryW(MAX_PATH,file_path);
    strcat(file_path,"\\01\\01_01.html");
    
    strcopy(run_exe,"iexplore.exe");
    
    ShellExecute(0,0,run_exe,file_path,0,SW_SHOW);

    JCH


    • Upravený Jan Chaloupek pondělí 14. května 2012 7:57
    • Označen jako odpověď AmarLite pondělí 14. května 2012 8:57
    pondělí 14. května 2012 7:56
  • Děkuji Vám za pomoc, moc jste mi pomohl!

    Problém jsem nakonec vyřešil trošku jinak: celé to šlo zapsat takto, kdyby to později někdo potřeboval.

    void Sekce01b::OnBnClickedMfcbutton1()
    {
    ShellExecute(0, L"open", L"01\\01_01.pdf",0 ,0, SW_SHOW);
    }

    Celý vtip byl v tom, že se to nesmělo otevírat v prohlížeči, jinak to prohlížeč zadal vyhledat :)

    pondělí 14. května 2012 8:56