c++ - getcurrentdirectory - ¿Cómo obtener el Directorio actual?
manejo de directorios en c (14)
He estado haciendo esto en C # y Delphi, pero C ++ es malo. El propósito es crear un archivo en el directorio actual (donde se ejecuta el ejecutable).
Mi código:
LPTSTR NPath = NULL;
DWORD a = GetCurrentDirectory(MAX_PATH,NPath);
HANDLE hNewFile = CreateFile(NPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
Obtengo una excepción en GetCurrentDirectory ().
Por favor, dime por qué recibo una excepción y ¿cómo puedo hacerlo más fácil en C ++?
¿Por qué nadie aquí considera usar este código simple?
TCHAR szDir[MAX_PATH] = { 0 };
GetModuleFileName(NULL, szDir, MAX_PATH);
szDir[std::string(szDir).find_last_of("///")] = 0;
o incluso más simple
TCHAR szDir[MAX_PATH] = { 0 };
TCHAR* szEnd = nullptr;
GetModuleFileName(NULL, szDir, MAX_PATH);
szEnd = _tcsrchr(szDir, ''//');
*szEnd = 0;
Debe proporcionar un marcador de posición de búfer válido. es decir:
TCHAR s[100];
DWORD a = GetCurrentDirectory(100, s);
En mi humilde opinión aquí hay algunas mejoras a la respuesta de anon .
#include <windows.h>
#include <string>
#include <iostream>
std::string GetExeFileName()
{
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
return std::string(buffer);
}
std::string GetExePath()
{
std::string f = GetExeFileName();
return f.substr(0, f.find_last_of( "///" ));
}
Fragmentos de código de mi proyecto CAE con entorno de desarrollo unicode:
/// @brief Gets current module file path.
std::string getModuleFilePath() {
TCHAR buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
CT2CA pszPath(buffer);
std::string path(pszPath);
std::string::size_type pos = path.find_last_of("///");
return path.substr( 0, pos);
}
Simplemente use el templete CA2CAEX o CA2AEX que llama a la API interna :: MultiByteToWideChar o :: WideCharToMultiByte .
GetCurrentDirectory () obtiene el directorio actual, que es donde se invoca el exe. Para obtener la ubicación del exe, use GetModuleFileName (NULL ...). si tiene el control para el exe, o puede derivarlo de GetCommandLine () si no lo hace.
Como señala el Sr. Butterworth, no necesitas un mango.
No olvide inicializar sus búferes en algo antes de utilizarlos. Y lo que es igual de importante, dale espacio a tus buffers de cadena para la terminación nula
TCHAR path[MAX_PATH+1] = L"";
DWORD len = GetCurrentDirectory(MAX_PATH, path);
Para encontrar el directorio donde está el ejecutable, puede usar:
TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);
Puede eliminar el nombre de archivo de GetModuleFileName()
de una manera más elegante:
TCHAR fullPath[MAX_PATH];
TCHAR driveLetter[3];
TCHAR directory[MAX_PATH];
TCHAR FinalPath[MAX_PATH];
GetModuleFileName(NULL, fullPath, MAX_PATH);
_splitpath(fullPath, driveLetter, directory, NULL, NULL);
sprintf(FinalPath, "%s%s",driveLetter, directory);
¡Espero eso ayude!
Yo recomendaría leer un libro en C ++ antes de ir más lejos, ya que sería útil tener una base más firme. Acelerado C ++ por Koenig y Moo es excelente.
Para obtener la ruta ejecutable, use GetModuleFileName :
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
Aquí hay una función de C ++ que obtiene el directorio sin el nombre del archivo:
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;;
string ExePath() {
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
string::size_type pos = string( buffer ).find_last_of( "///" );
return string( buffer ).substr( 0, pos);
}
int main() {
cout << "my directory is " << ExePath() << "/n";
}
GetCurrentDirectory
no asigna espacio para el resultado, depende de usted hacer eso.
TCHAR NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
Además, eche un vistazo a la biblioteca Boost.Filesystem si desea hacer esto de la manera C ++.
#include <iostream>
#include <stdio.h>
#include <dirent.h>
std::string current_working_directory()
{
char* cwd = _getcwd( 0, 0 ) ; // **** microsoft specific ****
std::string working_directory(cwd) ;
std::free(cwd) ;
return working_directory ;
}
int main(){
std::cout << "i am now in " << current_working_directory() << endl;
}
No pude usar GetModuleFileName correctamente. Encontré este trabajo muy bien. acaba de probar en Windows, aún no probar en Linux :)
#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);
}
String^ exePath = Application::ExecutablePath;<br>
MessageBox::Show(exePath);
WCHAR path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, MAX_PATH);
PathRemoveFileSpec(path);