Получите путь исполняемого файла

Что-то вроде этого должно сделать это:

Assembly assembly = Assembly.LoadFrom("Reports.dll");
Stream stream = assembly.GetManifestResourceStream("Reports.MyReport.rdlc");
reportViewer.LocalReport.LoadReportDefinition(stream);
105
задан Ben Hymers 6 October 2009 в 21:52
поделиться

4 ответа

Насколько я знаю, кроссплатформенный способ не существует.

Для Linux: readlink / proc / self / exe

Windows: GetModuleFileName

78
ответ дан 24 November 2019 в 04:00
поделиться

Следующее работает как быстрое и грязное решение, но учтите, что оно далеко не надежно:

#include <iostream>

using namespace std ;

int main( int argc, char** argv)
{
    cout << argv[0] << endl ;
    return 0;
}
1
ответ дан 24 November 2019 в 04:00
поделиться

Для Windows вы можете использовать GetModuleFilename ().
Для Linux см. BinReloc (старый, несуществующий URL) зеркало BinReloc в репозиториях datenwolf на GitHub .

3
ответ дан 24 November 2019 в 04:00
поделиться

Этот способ использует boost + argv. Вы упомянули, что это не может быть кросс-платформенный, потому что он может включать или не включать имя исполняемого файла. Следующий код должен обойти это.

#include <boost/filesystem/operations.hpp>

#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    fs::path full_path( fs::initial_path<fs::path>() );

    full_path = fs::system_complete( fs::path( argv[0] ) );

    std::cout << full_path << std::endl;

    //Without file name
    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basename(full_path) << std::endl;

    return 0;
}

Следующий код получает текущий рабочий каталог, который может делать то, что вам нужно.

#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    //current working directory
    fs::path full_path( fs::current_path<fs::path>() );

    std::cout << full_path << std::endl;

    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basepath(full_path) << std::endl;

    return 0;
}

Примечание Только что понял, что basename () устарело, поэтому пришлось переключиться на .stem ()

30
ответ дан 24 November 2019 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: