วิธีรับไดเรกทอรีปัจจุบันในโปรแกรม C


163

ฉันกำลังสร้างโปรแกรม C ที่ฉันต้องการรับไดเรกทอรีที่โปรแกรมนั้นเริ่มต้น โปรแกรมนี้เขียนขึ้นสำหรับคอมพิวเตอร์ UNIX ฉันได้รับการดูopendir()และtelldir()แต่telldir()ส่งกลับoff_t (long int)ดังนั้นจริงๆมันไม่ช่วยฉัน

ฉันจะรับเส้นทางปัจจุบันในสตริง (อาร์เรย์ char) ได้อย่างไร

คำตอบ:


292

คุณเคยดูgetcwd()ไหม?

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

ตัวอย่างง่ายๆ:

#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
การเลือก nits ที่ลำบากที่สุด <errno.h> ดูเหมือนไม่จำเป็นและโปรแกรมรายงานว่าประสบความสำเร็จแม้จะล้มเหลวผ่านสถานะออก มิฉะนั้นเป็นตัวอย่างที่ดี
Jonathan Leffler

21
โอ้และมันธรรมดากว่าที่จะใช้ printf (... ) แทน fprintf (stdout, ... ) หรือไม่
Jonathan Leffler

19
@JanathanLeffler: นั่นไม่ใช่จู้จี้จุกจิกที่สุด นี้คือควรจะเป็นint main() int main(void)
Keith Thompson

4
ฉันจะใช้ PATH_MAX จากขีด จำกัด . แทนที่จะเป็นเลขเวทหาก ~ 4KB บนสแต็กไม่ใช่ปัญหา
jacekmigacz

1
ยังคงไม่ได้มีบัฟเฟอร์ของคุณควรรองรับสตริงสิ้นสุดไบต์ / null char cwd[PATH_MAX+1]ดังนั้นที่ถูกต้องคือ หรือถ้าคุณไม่ได้ใส่ใจกับบัฟเฟอร์เพียงแค่char *buf=getcwd(NULL,0);และเมื่อคุณทำเสร็จแล้วfree(buf)(ณ
POSIX.1-2001

60

getcwdเงยหน้าขึ้นมองหน้าคนสำหรับ


7
@angad สอนชายคนหนึ่งให้ตกปลา แต่อย่างน้อยก็แสดงให้เขาเห็นเส้นทางไปที่ทะเลสาบ / ทะเล / มหาสมุทร :)
mtk

3
ผู้คนแนะนำคนให้กับคนที่พยายามใช้วิธีการค้นหาที่เหนือกว่าอย่างมหาศาลของ google
gbtimmon

3
ข้อมูลโค้ด: man 3 getcwd. ตลกกันอย่าอนาธิปไตยโพสต์นี้มาจาก '08 ดังนั้นอนุสัญญาจึงแตกต่างกัน
Kroltan

2
@gbtimmon google เป็นเครื่องมือค้นหามันไม่คล้ายกับหน้าคน ในที่สุดมันก็จะชี้ไปที่หน้าคน
Ajay Brahmakshatriya

24

แม้ว่าคำถามจะถูกแท็ก Unix แต่ผู้คนก็จะเข้ามาเยี่ยมชมเมื่อแพลตฟอร์มเป้าหมายของพวกเขาคือ Windows และคำตอบสำหรับ Windows คือGetCurrentDirectory()ฟังก์ชั่น:

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

คำตอบเหล่านี้ใช้กับทั้งรหัส C และ C ++

ลิงก์ที่แนะนำโดยuser4581301ในความคิดเห็นถึงคำถามอื่นและยืนยันว่าเป็นตัวเลือกอันดับต้น ๆ ในปัจจุบันด้วยการค้นหาของ Google 'เว็บไซต์: 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
ทำไมคุณไม่ใช้มาโครที่กำหนดไว้ล่วงหน้าเพื่อตรวจหาระบบปฏิบัติการเช่น #if ที่กำหนดไว้ (_WIN32) || define (_WIN64) || กำหนดไว้ ( WINDOWS )
HaseeB เมียร์

1

โปรดทราบว่าgetcwd(3)ยังมีอยู่ใน libc ของ Microsoft: getcwd (3)และทำงานในลักษณะเดียวกับที่คุณคาดหวัง

จะต้องเชื่อมโยงกับ-loldnames(oldnames.lib ซึ่งจะทำโดยอัตโนมัติในกรณีส่วนใหญ่) _getcwd()หรือการใช้งาน รุ่นที่ไม่มีการแก้ไขไม่พร้อมใช้งานใน Windows RT


0

ในการรับไดเรกทอรีปัจจุบัน (ที่คุณรันโปรแกรมเป้าหมายของคุณ) คุณสามารถใช้โค้ดตัวอย่างต่อไปนี้ซึ่งใช้ได้กับทั้ง Visual Studio และ Linux / MacOS (gcc / clang) ทั้ง C และ 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.