কিভাবে একটি সি প্রোগ্রামে বর্তমান ডিরেক্টরি পেতে?


162

আমি একটি সি প্রোগ্রাম তৈরি করছি যেখানে প্রোগ্রামটি শুরু হওয়া ডিরেক্টরিটি আমার পাওয়া দরকার। এই প্রোগ্রামটি ইউনিক্স কম্পিউটারগুলির জন্য লেখা written আমি দেখছিলাম opendir()এবং করছি telldir(), কিন্তু telldir()একটি ফেরত দিয়েছি off_t (long int), তাই এটি সত্যিই আমাকে সাহায্য করে না।

আমি কীভাবে একটি স্ট্রিং (চর অ্যারে) এ বর্তমান পাব?

উত্তর:


291

আপনি একবার তাকান আছে 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
সেরা বাছাই করা বাছাই করা, <errno.h> অপ্রয়োজনীয় বলে মনে হচ্ছে এবং প্রোগ্রামটি তার প্রস্থান স্থিতির মাধ্যমে ব্যর্থতার পরেও সাফল্যের খবর দেয়। অন্যথায়, একটি দুর্দান্ত উদাহরণ।
জোনাথন লেফলার

21
ওহ, এবং এফপ্রিন্টফ (স্টাডাউট, ...) এর জায়গায় প্রিন্টফ (...) ব্যবহার করা কি আরও প্রচলিত?
জোনাথন লেফলার

19
@ জোনাথনলফলার: এটি নিটের সেরা বাছাই নয়। এটি হ'ল: int main()হওয়া উচিত int main(void)
কিথ থম্পসন

4
স্ট্যাকের উপর MA 4KB যদি কোনও সমস্যা না হয় তবে আমি সীমাবদ্ধতা থেকে PATH_MAX ব্যবহার করব magic
jacekmigacz

1
এখনও সেখানে নেই, আপনার বাফারটিও স্ট্রিং-টার্মিনেশন বাইট / নুলের জন্য উপযুক্ত হওয়া উচিত, সুতরাং সঠিকটি char cwd[PATH_MAX+1]। অথবা আপনি যদি কেবল বাফার নিয়ে বিরক্ত না হয়ে থাকেন char *buf=getcwd(NULL,0);এবং আপনার কাজটি সম্পন্ন করার সময় free(buf)(POSIX.1-2-2001 হিসাবে)
bliako

60

জন্য man পৃষ্ঠা দেখুন getcwd


7
@ বঙ্গদ একজনকে মাছ ধরতে শেখায় তবে কমপক্ষে তাকে হ্রদ / সমুদ্র / সমুদ্রের দিকে পথ দেখায় :)
এমটিকে

3
গুগল স্পর্শ ছাড়াই বহুলতর উন্নত অনুসন্ধান পদ্ধতি ব্যবহার করার চেষ্টা করছে এমন লোকদের কাছে লোককে সুপারিশকারী লোকেরা।
gbtimmon

3
কোড স্নিপেট: man 3 getcwd। জোকস একদিকে রাখুন, অরাজকতাবাদী হবেন না, এই পোস্টটি '08-এর, এসও কনভেনশনগুলি আলাদা ছিল।
Kroltan

2
@gbtimmon গুগল একটি অনুসন্ধান ইঞ্জিন, এটি ম্যান পৃষ্ঠার সাথে সাদৃশ্য নয়। এটি শেষ পর্যন্ত ম্যান পৃষ্ঠাতে নির্দেশ করতে চলেছে।
অজয় ব্রহ্মক্ষত্রিয়

24

যদিও প্রশ্নটি ইউনিক্স ট্যাগ করা হয়েছে, লোকেরা যখন তাদের টার্গেট প্ল্যাটফর্মটি উইন্ডোজ হয় তখন এটি দেখতেও আসে এবং উইন্ডোজটির উত্তরটি হ'ল GetCurrentDirectory()ফাংশন:

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

এই উত্তরগুলি সি এবং সি ++ কোড উভয় ক্ষেত্রেই প্রযোজ্য।

ব্যবহারকারী 454581301 দ্বারা অন্য প্রশ্নের একটি মন্তব্যে প্রস্তাবিত লিঙ্ক , এবং একটি গুগল অনুসন্ধান 'সাইট: মাইক্রোসফট.কম getCurrentdirectory' দিয়ে বর্তমান শীর্ষ পছন্দ হিসাবে যাচাই করা হয়েছে Link


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) এর মতো ওএস সনাক্তকরণের জন্য কেন পূর্ব-সংজ্ঞায়িত ম্যাক্রো ব্যবহার করবেন না || সংজ্ঞায়িত (_WIN64) || সংজ্ঞায়িত ( উইন্ডোজ )
হ'সিসিআইবির মিআর

1

নোট যে getcwd(3)মাইক্রোসফ্ট এর libc : getcwd (3) এও উপলব্ধ এবং আপনি যেভাবে প্রত্যাশা করতেন সেভাবে কাজ করে।

অবশ্যই -loldnames(ওল্ডনেস.লিব, যা বেশিরভাগ ক্ষেত্রে স্বয়ংক্রিয়ভাবে সম্পন্ন হয়) এর সাথে লিঙ্ক করতে হবে , বা ব্যবহার করতে হবে _getcwd()। উইন্ডোজ আরটি-এর আওতায় অনির্ধারিত সংস্করণ অনুপলব্ধ।


0

বর্তমান ডিরেক্টরি পেতে (যেখানে আপনি আপনার টার্গেট প্রোগ্রামটি কার্যকর করেন), আপনি নিম্নলিখিত উদাহরণ কোডটি ব্যবহার করতে পারেন, যা ভিজ্যুয়াল স্টুডিও এবং লিনাক্স / ম্যাকোস (জিসিসি / বিড়ম্বনা), উভয় সি এবং সি ++ এর জন্য কাজ করে:

#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.