Bagaimana cara mendapatkan direktori saat ini dalam program C?


162

Saya membuat program C di mana saya harus mendapatkan direktori tempat program dimulai. Program ini ditulis untuk komputer UNIX. Saya telah melihat opendir()dan telldir(), tetapi telldir()mengembalikan off_t (long int), jadi itu benar-benar tidak membantu saya.

Bagaimana saya bisa mendapatkan jalur saat ini dalam string (array char)?

Jawaban:


291

Apakah Anda sudah melihatnya getcwd()?

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

Contoh sederhana:

#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
Memilih nits terpilih, <errno.h> tampaknya tidak perlu, dan program melaporkan keberhasilan bahkan pada kegagalan melalui status keluarnya. Kalau tidak, contoh yang bagus.
Jonathan Leffler

21
Oh, dan apakah lebih konvensional menggunakan printf (...) sebagai ganti fprintf (stdout, ...)?
Jonathan Leffler

19
@ JonathanLeffler: Itu bukan yang paling dipilih nits. Ini: int main()seharusnya int main(void).
Keith Thompson

4
Saya akan menggunakan PATH_MAX dari limit.h, alih-alih angka ajaib jika ~ 4KB di stack tidak menjadi masalah.
jacekmigacz

1
Masih tidak ada, buffer Anda juga harus mengakomodasi byte-null string-termination, oleh karena itu yang benar adalah char cwd[PATH_MAX+1]. Atau jika Anda tidak dapat diganggu dengan buffer secara adil char *buf=getcwd(NULL,0);dan ketika Anda selesai free(buf)(pada POSIX.1-2001)
bliako

60

Cari halaman manual untuk getcwd.


7
@angad mengajar seorang pria untuk memancing tetapi setidaknya menunjukkan kepadanya jalan ke danau / laut / laut :)
mtk

3
orang merekomendasikan pria kepada orang-orang yang mencoba menggunakan metode pencarian yang jauh lebih unggul dari Google.
gbtimmon

3
Kode potongan: man 3 getcwd. Selain lelucon, jangan anarkonistik, posting ini dari '08, konvensi SO berbeda.
Kroltan

2
@gbtimmon google adalah mesin pencari, itu tidak analog dengan halaman manual. Ini akhirnya akan menunjuk ke halaman manual.
Ajay Brahmakshatriya

24

Meskipun pertanyaannya ditandai Unix, orang juga bisa mengunjunginya ketika platform target mereka adalah Windows, dan jawaban untuk Windows adalah GetCurrentDirectory()fungsinya:

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

Jawaban ini berlaku untuk kode C dan C ++.

Tautan yang disarankan oleh pengguna4581301 dalam komentar ke pertanyaan lain, dan diverifikasi sebagai pilihan teratas saat ini dengan pencarian Google 'situs: microsoft.com getcurrentdirectory'.


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
Mengapa Anda tidak menggunakan macro yang telah ditentukan sebelumnya untuk mendeteksi OS seperti #jika didefinisikan (_WIN32) || didefinisikan (_WIN64) || didefinisikan ( WINDOWS )
HaseeB Mir

1

Catatan yang getcwd(3)juga tersedia di libc Microsoft: getcwd (3) , dan berfungsi seperti yang Anda harapkan.

Harus ditautkan dengan -loldnames(oldnames.lib, yang dilakukan secara otomatis di sebagian besar kasus), atau gunakan _getcwd(). Versi yang tidak diperbaiki tidak tersedia di bawah Windows RT.


0

Untuk mendapatkan direktori saat ini (di mana Anda menjalankan program target Anda), Anda dapat menggunakan kode contoh berikut, yang berfungsi untuk Visual Studio dan Linux / MacOS (gcc / dentang), baik C dan 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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.