Geçerli dizini bir C programında nasıl edinebilirim?


163

Programın başlatıldığı dizini almam gereken bir C programı yapıyorum. Bu program UNIX bilgisayarları için yazılmıştır. Ben bakarak oldum opendir()ve telldir()ancak telldir()bir döner off_t (long int)gerçekten bana yardım etmez, bu yüzden.

Bir dizede (char dizisi) geçerli yolu nasıl alabilirim?

Yanıtlar:


292

Bir baktın mı getcwd()?

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

Basit örnek:

#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
En çok nit olanı seçerken, <errno.h> gereksiz görünüyor ve program çıkış durumu üzerinden başarısız olsa bile başarıyı rapor ediyor. Aksi takdirde güzel bir örnek.
— Jonathan Leffler

21
Oh, ve fprintf (stdout, ...) yerine printf (...) kullanmak daha geleneksel mi?
— Jonathan Leffler

19
@JonathanLeffler: Bu en heyecanlıların değil. Bu: int main()olmalı int main(void).
— Keith Thompson

4
Yığında ~ 4KB bir sorun değilse, sihirli sayı yerine limit.h, PATH_MAX kullanırdım.
— jacekmigacz

1
Hala orada değil, arabellek dizesi sonlandırma bayt / null için de uygun olmalıdır, bu nedenle doğru olanıdır char cwd[PATH_MAX+1]. Veya sadece arabelleklerden rahatsız olmuyorsanız ve işiniz char *buf=getcwd(NULL,0);bittiğinde free(buf)(POSIX.1-2001 itibariyle)
— bliako

60

Adam sayfasına bakın getcwd.


7
@angad balık adam öğretmek ama en azından göle / deniz / okyanus yolunu göstermek :)
— mtk

3
google son derece üstün arama yöntemini kullanmaya çalışan kişilere adam tavsiye insanlar temas dışında.
— gbtimmon

3
Kod pasajı: man 3 getcwd. Şakalar bir yana, anarkoşik olma, bu yazı '08'den, SO sözleşmeleri farklıydı.
— Kroltan

2
@gbtimmon google bir arama motorudur, man sayfasına benzemez. Sonunda man sayfasını gösterecek.
— Ajay Brahmakshatriya

24

Her ne kadar soru Unix olarak etiketlenmiş olsa da, insanlar hedef platformları Windows olduğunda da ziyarete gelirler ve Windows için cevap GetCurrentDirectory()işlevdir:

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

Bu yanıtlar hem C hem de C ++ kodu için geçerlidir.

Bağlantı önerdiği user4581301 bir de açıklama başka soruya ve Google arama 'site: microsoft.com GetCurrentDirectory' ile şimdiki en iyi seçenek olarak doğrulandı.


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
Neden #if tanımlı (_WIN32) gibi işletim sistemi algılamak için önceden tanımlanmış makrolar kullanmıyorsunuz || tanımlanmış (_WIN64) || tanımlandı ( WINDOWS )
— HaseeB Mir

1

getcwd(3)Microsoft'un libc: getcwd (3) sürümünde de mevcut olduğunu ve beklediğiniz gibi çalıştığını unutmayın.

-loldnames(Çoğu durumda otomatik olarak yapılan oldnames.lib) ile bağlantı kurmalı veya kullanmalısınız _getcwd(). Önceden düzeltilmemiş sürüm Windows RT altında kullanılamaz.


0

Geçerli dizini (hedef programınızı yürüttüğünüz yer) almak için, hem Visual Studio hem de Linux / MacOS (gcc / clang), hem C hem de C ++ için çalışan aşağıdaki örnek kodu kullanabilirsiniz:

#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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.