Получить каталог программы на окнах [дубликат]

Используйте .combine_first.

df['Period'] = df['Year'].combine_first(df['Quarter'])
230
задан casperOne 14 February 2013 в 14:53
поделиться

20 ответов

Вот код, чтобы получить полный путь к исполняемому приложению:

Windows:

int bytes = GetModuleFileName(NULL, pBuf, len);
if(bytes == 0)
    return -1;
else
    return bytes;

Linux:

char szTmp[32];
sprintf(szTmp, "/proc/%d/exe", getpid());
int bytes = MIN(readlink(szTmp, pBuf, len), len - 1);
if(bytes >= 0)
    pBuf[bytes] = '\0';
return bytes;
154
ответ дан user 23 August 2018 в 18:36
поделиться

В Windows самый простой способ - использовать функцию _get_pgmptr в stdlib.h, чтобы получить указатель на строку, которая представляет абсолютный путь к исполняемому файлу, включая имя исполняемого файла.

char* path;
_get_pgmptr(&path);
printf(path); // Example output: C:/Projects/Hello/World.exe
3
ответ дан Adam Yaxley 23 August 2018 в 18:36
поделиться

Если вы загружаете текущую директорию, когда ваша программа запускается сначала, вы фактически получаете каталог, из которого была запущена ваша программа. Сохраните значение в переменной и обратитесь к нему позже в вашей программе. Это отличается от каталога, который содержит текущий исполняемый файл программы . Это не обязательно один и тот же каталог; если кто-то запускает программу из командной строки, тогда программа запускается из текущего рабочего каталога командной строки, даже если файл программы живет в другом месте.

getcwd - это функция POSIX и поддерживается на всех платформах, совместимых с POSIX. Вам не нужно было делать что-либо особенное (кроме того, что нужно было вставлять правильные заголовки unistd.h в Unix и direct.h на windows).

Поскольку вы создаете программу на языке C, она будет ссылаться на запуск c по умолчанию c которая связана с ВСЕМИ процессами в системе (исключение специально созданных исключений), и она будет включать эту функцию по умолчанию. CRT никогда не считается внешней библиотекой, поскольку он обеспечивает базовый стандартный совместимый интерфейс для ОС.

В Windows функция getcwd устарела в пользу _getcwd. Я думаю, вы могли бы использовать его таким образом.

#include <stdio.h>  /* defines FILENAME_MAX */
#ifdef WINDOWS
    #include <direct.h>
    #define GetCurrentDir _getcwd
#else
    #include <unistd.h>
    #define GetCurrentDir getcwd
 #endif

 char cCurrentPath[FILENAME_MAX];

 if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
     {
     return errno;
     }

cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */

printf ("The current working directory is %s", cCurrentPath);
152
ответ дан Community 23 August 2018 в 18:36
поделиться

Вы не можете использовать argv [0] для этой цели, обычно он содержит полный путь к исполняемому файлу, но не обязательно - процесс может быть создан с произвольным значением в поле.

Также обратите внимание, что текущий каталог и каталог с исполняемым файлом - это две разные вещи, поэтому getcwd () также вам не поможет.

В Windows используйте GetModuleFileName (), на Linux read / dev / proc / procID / .. файлы.

6
ответ дан eugensk00 23 August 2018 в 18:36
поделиться
#include <windows.h>
using namespace std;

// The directory path returned by native GetCurrentDirectory() no end backslash
string getCurrentDirectoryOnWindows()
{
    const unsigned long maxDir = 260;
    char currentDir[maxDir];
    GetCurrentDirectory(maxDir, currentDir);
    return string(currentDir);
}
1
ответ дан freezotic 23 August 2018 в 18:36
поделиться

На платформах POSIX вы можете использовать getcwd () .

В Windows вы можете использовать _getcwd () , так как использование getcwd () устарел.

Для стандартных библиотек, если Boost был достаточно стандартен для вас, я бы предложил Boost :: filesystem, но они, похоже, удалили нормализацию пути из предложение. Возможно, вам придется подождать, пока TR2 не станет доступен для полностью стандартного решения.

0
ответ дан Fruny 23 August 2018 в 18:36
поделиться

Для относительных путей, вот что я сделал. Я знаю возраст этого вопроса, я просто хочу внести более простой ответ, который работает в большинстве случаев:

Предположим, что у вас есть такой путь:

"path/to/file/folder"

По какой-то причине исполняемые Linux-исполняемые файлы, созданные в eclipse, отлично справляются с этим. Тем не менее, окна очень запутаны, если им задан такой путь, с которым нужно работать!

Как указано выше, существует несколько способов получить текущий путь к исполняемому файлу, но самый простой способ, который я нахожу, создает прелесть в большинство случаев добавляет это к FRONT вашего пути:

"./path/to/file/folder"

Просто добавив «./», вы должны отсортировать вас! :) Затем вы можете начать загрузку из любой директории, если хотите, с самим исполняемым файлом.

EDIT: Это не сработает, если вы попытаетесь запустить исполняемый файл из кода :: blocks if это среда разработки, так как по какой-то причине код :: блоки не загружает прав ...: D

EDIT2: Некоторые новые вещи, которые я нашел, это то, что если вы укажете статический путь например, в вашем коде (Предположим, что Example.data - это то, что вам нужно загрузить):

"resources/Example.data"

Если вы запустите приложение из фактического каталога (или в Windows вы создаете ярлык и установите рабочий каталог в каталог приложения), тогда он будет работать так. Помните об этом при отладке проблем, связанных с отсутствием путей к ресурсам и файлам. (Особенно в IDE, которые устанавливают неправильный рабочий каталог при запуске сборки exe из среды IDE)

1
ответ дан FuzzyQuills 23 August 2018 в 18:36
поделиться

Может быть, конкатенировать текущий рабочий каталог с argv [0]? Я не уверен, что это будет работать в Windows, но оно работает в linux.

Например:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv) {
    char the_path[256];

    getcwd(the_path, 255);
    strcat(the_path, "/");
    strcat(the_path, argv[0]);

    printf("%s\n", the_path);

    return 0;
}

При запуске он выдает:

jeremy @ jeremy-desktop: ~ / Desktop $ ./test /home/jeremy/Desktop/./test

7
ответ дан Jeremy Ruten 23 August 2018 в 18:36
поделиться

Решение библиотеки (хотя я знаю, что этого не было задано). Если вы используете Qt: QCoreApplication::applicationDirPath()

-1
ответ дан Joachim 23 August 2018 в 18:36
поделиться

Файл initial_path() Boost файловой системы ведет себя как POSIX getcwd(), и он не делает то, что вы хотите сам по себе, но добавление argv[0] к любому из них должно это сделать.

Вы можете заметить, что результат не всегда красиво - вы можете получить такие вещи, как /foo/bar/../../baz/a.out или /foo/bar//baz/a.out, но я считаю, что он всегда приводит к допустимому пути, который называет исполняемый файл (обратите внимание, что последовательные слэши в пути сворачиваются в один).

Я ранее написал решение, используя envp (третий аргумент main(), который работал в Linux, но не казался работоспособным в Windows, поэтому я по существу рекомендую то же решение, что и раньше, но с дополнительным объяснением того, почему это действительно правильно, даже если результаты не очень хороши.

0
ответ дан John Zwinck 23 August 2018 в 18:36
поделиться

Команда linux bash, в которой progname сообщит о пути к программе.

Даже если вы можете выдать какую-либо команду из вашей программы и направить вывод в файл tmp, и программа впоследствии прочтет, что tmp файл, он не скажет вам, является ли эта программа исполняемой. Он сообщает только, где находится программа с таким именем.

Требуется получить номер идентификатора вашего процесса и проанализировать путь к имени

. В моей программе Я хочу знать, была ли программа выполнена из каталога bin пользователя или из другого в пути или из / usr / bin. / usr / bin будет содержать поддерживаемую версию. Я чувствую, что в Linux есть одно портативное решение.

1
ответ дан Leslie Satenstein 23 August 2018 в 18:36
поделиться

Файловая система TS теперь является стандартной (и поддерживается gcc 5.3+ и clang 3.9+), поэтому вы можете использовать функцию current_path() :

std::string path = std::experimental::filesystem::current_path();

В gcc (5.3+) для включения файловой системы вам необходимо использовать:

#include <experimental/filesystem>

и связать свой код с флагом -lstdc++fs.

Если вы хотите использовать файловую систему с Microsoft Visual Studio, тогда прочитайте это .

15
ответ дан Marqin 23 August 2018 в 18:36
поделиться

Нет, стандартного способа нет. Я считаю, что стандарты C / C ++ даже не учитывают существование каталогов (или других организаций файловой системы).

В Windows GetModuleFileName () вернет полный путь к исполняемому файлу текущего процесс, когда для параметра hModule установлено значение NULL. Я не могу помочь с Linux.

Также вы должны уточнить, хотите ли вы, чтобы текущий каталог или каталог находились в образе / исполняемом файле программы. В этом вопросе ваш вопрос немного неоднозначен в этом вопросе.

8
ответ дан Michael Burr 23 August 2018 в 18:36
поделиться

Чтобы запоздало нагромождать здесь ...

нет стандартного решения, потому что языки агностически относятся к базовым файловым системам, так как другие говорили, что концепция файловой системы на основе каталогов выходит за рамки языков c / c ++.

Кроме того, вы не хотите, чтобы текущий рабочий каталог, но каталог, в котором запущена программа, который должен учитывать, как программа дошла до где он есть - то есть он был порожден как новый процесс через вилку и т. д. Чтобы получить каталог, в котором запущена программа, как продемонстрировали решения, требуется, чтобы вы получили эту информацию из структур управления процессом операционной системы в вопрос, который является единственным органом по этому вопросу. Таким образом, по определению, это решение, специфичное для ОС.

3
ответ дан Minok 23 August 2018 в 18:36
поделиться

Как упоминалось Minok , такой функциональности не указан в стандарте ini C или стандарте C ++. Это считается чисто специфичной для ОС функцией и, например, указывается в стандарте POSIX.

Thorsten79 дал хорошее предложение, это библиотека Boost.Filesystem. Тем не менее, это может быть неудобно, если вы не хотите иметь какие-либо зависимости времени между ссылками в бинарной форме для вашей программы.

Хорошей альтернативой, которую я бы рекомендовал, является сбор всего 100% заголовков STLSoft C ++ Libraries Мэтью Уилсон (автор обязательных книг о C ++). Существует портативный фасад PlatformSTL предоставляет доступ к системному API: WinSTL для Windows и UnixSTL в Unix, поэтому это портативное решение. Все элементы, относящиеся к системе, задаются с использованием признаков и политик, поэтому это расширяемая структура. Конечно, есть библиотека файловой системы.

0
ответ дан mloskot 23 August 2018 в 18:36
поделиться

Для системы Windows на консоли вы можете использовать команду system (dir). Консоль дает вам информацию о каталоге и т. Д. Читайте о команде dir в cmd. Но для Unix-подобных систем я не знаю ... Если эта команда запущена, прочитайте команду bash. ls не отображает каталог ...

Пример:

int main()
{
    system("dir");
    system("pause"); //this wait for Enter-key-press;
    return 0;
}
4
ответ дан Nick Cox 23 August 2018 в 18:36
поделиться

Это из форума cplusplus

В окнах:

#include <string>
#include <windows.h>

std::string getexepath()
{
  char result[ MAX_PATH ];
  return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
}

В Linux:

#include <string>
#include <limits.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
  return std::string( result, (count > 0) ? count : 0 );
}

Вкл. HP-UX:

#include <string>
#include <limits.h>
#define _PSTAT64
#include <sys/pstat.h>
#include <sys/types.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  struct pst_status ps;

  if (pstat_getproc( &ps, sizeof( ps ), 0, getpid() ) < 0)
    return std::string();

  if (pstat_getpathname( result, PATH_MAX, &ps.pst_fid_text ) < 0)
    return std::string();

  return std::string( result );
}
28
ответ дан Octopus 23 August 2018 в 18:36
поделиться

Я знаю, что очень поздно в этот день ответить на этот вопрос, но я обнаружил, что ни один из ответов не был так полезен для меня, как мое собственное решение. Очень простой способ получить путь от вашего CWD к вашей папке bin выглядит следующим образом:

int main(int argc, char* argv[])
{
    std::string argv_str(argv[0]);
    std::string base = argv_str.substr(0, argv_str.find_last_of("/"));
}

Теперь вы можете просто использовать это как базу для своего относительного пути. Так, например, у меня есть эта структура каталогов:

main
  ----> test
  ----> src
  ----> bin

, и я хочу скомпилировать свой исходный код в bin и записать журнал для проверки. Я могу просто добавить эту строку в свой код.

std::string pathToWrite = base + "/../test/test.log";

Я пробовал этот подход в Linux, используя полный путь, псевдоним и т. д., и он отлично работает.

ПРИМЕЧАНИЕ:

Если вы находитесь в окнах, вы должны использовать '\' в качестве разделителя файлов не '/'. Вам также придется избегать этого, например:

std::string base = argv[0].substr(0, argv[0].find_last_of("\\"));

Я думаю, что это должно работать, но не проверено, поэтому комментарий будет оценен, если он работает, или исправить, если нет.

14
ответ дан Sam Redway 23 August 2018 в 18:36
поделиться

Если вы хотите стандартный путь без библиотек: Нет. Вся концепция каталога не включена в стандарт.

Если вы согласны с тем, что некоторая (переносная) зависимость от почти стандартной библиотеки lib ok: Используйте библиотеку файловой системы Boost и попросите initial_path () .

IMHO, это как можно ближе, с хорошей кармой (Boost - это хорошо зарекомендовавший себя набор высококачественных библиотек)

27
ответ дан Thorsten79 23 August 2018 в 18:36
поделиться

Для Win32 GetCurrentDirectory должен выполнить трюк.

5
ответ дан Torbjörn Gyllebring 23 August 2018 в 18:36
поделиться
Другие вопросы по тегам:

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