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.