Come ottenere la directory corrente in un programma C?


163

Sto realizzando un programma C in cui ho bisogno di ottenere la directory da cui è stato avviato il programma. Questo programma è scritto per computer UNIX. Ho guardato opendir()e telldir(), ma telldir()restituisce un off_t (long int), quindi non mi aiuta davvero.

Come posso ottenere il percorso corrente in una stringa (array di caratteri)?

Risposte:


292

Hai dato un'occhiata getcwd()?

#include <unistd.h>
char *getcwd(char *buf, size_t size);

Esempio semplice:

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

int main() {
   char cwd[PATH_MAX];
   if (getcwd(cwd, sizeof(cwd)) != NULL) {
       printf("Current working dir: %s\n", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}

11
Scegliendo il più esigente di nits, <errno.h> sembra inutile e il programma segnala il successo anche in caso di errore tramite il suo stato di uscita. Altrimenti, un bell'esempio.
Jonathan Leffler,

21
Oh, ed è più convenzionale usare printf (...) al posto di fprintf (stdout, ...)?
Jonathan Leffler,

19
@JonathanLeffler: Questa non è la più delicata delle lendini. Questo è: int main()dovrebbe essere int main(void).
Keith Thompson,

4
Userei PATH_MAX da limits.h, invece del numero magico se ~ 4KB sullo stack non è un problema.
jacekmigacz,

1
Ancora non presente, il buffer dovrebbe anche contenere byte / null di terminazione stringa, pertanto è quello corretto char cwd[PATH_MAX+1]. O se non puoi essere infastidito dai buffer solo char *buf=getcwd(NULL,0);e quando hai finito free(buf)(a partire da POSIX.1-2001)
bliako

60

Cerca la pagina man per getcwd.


7
@angad insegna a un uomo a pescare ma almeno gli mostra il percorso verso il lago / mare / oceano :)
mtk,

3
le persone che raccomandano l'uomo alle persone che cercano di utilizzare il metodo di ricerca di gran lunga superiore google sono fuori dal mondo.
gbtimmon,

3
Frammento di codice: man 3 getcwd. Scherzi a parte, non essere anarchico, questo post è del '08, le convenzioni SO erano diverse.
Kroltan,

2
@gbtimmon google è un motore di ricerca, non è analogo alla pagina man. Alla fine indicherà la pagina man.
Ajay Brahmakshatriya,

24

Sebbene la domanda sia taggata Unix, le persone possono anche visitarla quando la loro piattaforma di destinazione è Windows e la risposta per Windows è la GetCurrentDirectory()funzione:

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);

Queste risposte si applicano sia al codice C che al codice C ++.

Link suggerito dall'utente4581301 in un commento a un'altra domanda e verificato come la migliore scelta corrente con un "sito: microsoft.com getcurrentdirectory" di ricerca di Google.


2
#include <stdio.h>  /* defines FILENAME_MAX */
//#define WINDOWS  /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

int main(){
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  printf("Current working dir: %s\n", buff);
  return 1;
}

3
Perché non usi le macro predefinite per rilevare il sistema operativo come #if definito (_WIN32) || definito (_WIN64) || definito ( WINDOWS )
HaseeB Mir

1

Nota che getcwd(3)è disponibile anche in libc di Microsoft: getcwd (3) e funziona come ti aspetteresti.

Deve essere collegato a -loldnames(oldnames.lib, che viene eseguito automaticamente nella maggior parte dei casi) o utilizzare _getcwd(). La versione non prefissata non è disponibile in Windows RT.


0

Per ottenere la directory corrente (dove si esegue il programma di destinazione), è possibile utilizzare il seguente codice di esempio, che funziona sia per Visual Studio che per Linux / MacOS (gcc / clang), sia C che C ++:

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

#if defined(_MSC_VER)
#include <direct.h>
#define getcwd _getcwd
#elif defined(__GNUC__)
#include <unistd.h>
#endif

int main() {
    char* buffer;

    if( (buffer=getcwd(NULL, 0)) == NULL) {
        perror("failed to get current directory\n");
    } else {
        printf("%s \nLength: %zu\n", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.