Cum să obțineți directorul curent într-un program C? (Programare, C, Unix, Director De Lucru)

Stian a intrebat.

Fac un program C în care trebuie să obțin directorul din care este pornit programul. Acest program este scris pentru calculatoare UNIX. M-am uitat la opendir() și telldir(), , dar telldir() returnează un off_t (long int), , așa că nu prea mă ajută.

Cum pot obține calea curentă într-un șir de caractere (char array)?

7 răspunsuri
Mic

Ați aruncat o privire la getcwd()?

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

Exemplu simplu:

#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
", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}

Comentarii

  • Dacă e să alegem cel mai pretențios aspect, <errno.h> pare inutil, iar programul raportează succesul chiar și în caz de eșec prin intermediul statusului de ieșire. În rest, un exemplu frumos. –  > Por Jonathan Leffler.
  • 23

  • Oh, și este mai convențional să folosiți printf(…) în loc de fprintf(stdout, …)? –  > Por Jonathan Leffler.
  • 21

  • @JonathanLeffler: Nu este cea mai pretențioasă dintre probleme. Asta este: int main() ar trebui să fie int main(void). –  > Por Keith Thompson.
  • Eu aș folosi PATH_MAX din limits.h, în loc de numărul magic, dacă ~4KB pe stivă nu reprezintă o problemă. –  > Por jacekmigacz.
  • Încă nu este acolo, buffer-ul tău ar trebui să se potrivească și pentru octetul de terminare a șirului de caractere/null, prin urmare, cel corect este char cwd[PATH_MAX+1]. Sau, dacă nu vă puteți deranja cu tampoane, doar char *buf=getcwd(NULL,0); și când ați terminat free(buf) (conform POSIX.1-2001) –  > Por bliako.
CAdaker

Căutați pagina de manual pentru getcwd.

Comentarii

  • @angad învață un om să pescuiască, dar cel puțin arată-i calea spre lac/mare/ocean 🙂 –  > Por mtk.
  • oamenii care recomandă man celor care încearcă să folosească metoda de căutare net superioară google sunt depășiți de situație. –  > Por gbtimmon.
  • Fragment de cod: man 3 getcwd. Lăsând glumele la o parte, nu fiți anarhiști, acest post este din ’08, SO convențiile erau altele. –  > Por Kroltan.
  • @gbtimmon google este un motor de căutare, nu este analog cu pagina de man. În cele din urmă va arăta spre pagina de manual. –  > Por Ajay Brahmakshatriya.
Jonathan Leffler

Deși întrebarea este etichetată Unix, oamenii ajung să o viziteze și atunci când platforma lor țintă este Windows, iar răspunsul pentru Windows este GetCurrentDirectory() funcție:

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

Aceste răspunsuri sunt valabile atât pentru codul C, cât și pentru codul C++.

Legătură sugerată de utilizatorul4581301 într-un comentariu la o altă întrebare și verificată ca fiind cea mai bună alegere curentă cu o căutare Google „site:microsoft.com getcurrentdirectory”.

Jevgenij Kononov
#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
", buff);
  return 1;
}

Comentarii

  • De ce nu folosiți macro-uri pre_definite pentru detectarea sistemului de operare, cum ar fi #if defined(_WIN32) || defined(_WIN64) || defined(WINDOWS) –  > Por HaseeB Mir.
  • -1. Răspuns copiat, vă rugăm să lăsați un link la răspunsul original –  > Por Anic17.
rvx

Rețineți că getcwd(3) este de asemenea disponibil în libc de la Microsoft: getcwd(3), , și funcționează în același mod în care vă așteptați.

Trebuie să se lege cu -loldnames (oldnames.lib, ceea ce se face automat în majoritatea cazurilor), sau utilizați _getcwd(). Versiunea nefixată nu este disponibilă sub Windows RT.

ChrisZZ

Pentru a obține directorul curent (unde executați programul țintă), puteți utiliza următorul cod de exemplu, care funcționează atât pentru Visual Studio, cât și pentru Linux/MacOS(gcc/clang), atât pentru C, cât și pentru 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
");
    } else {
        printf("%s 
Length: %zu
", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}

eeshtox

Utilizați getcwd

#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
", buff);
  return 1;
}

SAU

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

main() {
char *buf;
buf=(char *)malloc(100*sizeof(char));
getcwd(buf,100);
printf("
 %s 
",buf);
}