সি তে একটি নতুন ডিরেক্টরি তৈরি করা হচ্ছে


97

আমি একটি প্রোগ্রাম লিখতে চাই যা ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করে; যদি ডিরেক্টরিটি বিদ্যমান না থাকে তবে এটি এর ভিতরে ডিরেক্টরি এবং একটি লগ ফাইল তৈরি করে, তবে যদি ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকে, তবে এটি কেবলমাত্র সেই ফোল্ডারে একটি নতুন লগ ফাইল তৈরি করে।

লিনাক্সের সাথে সি-তে এটি কীভাবে করব?


4
mkdir ফাংশন একটি নতুন ডিরেক্টরি তৈরি করে, blog.tremend.ro/2008/10/06/…
fsonmezay

4
সম্ভবত এটি কারণ আপনি একটি সহজ অনুসন্ধান stackoverflow.com/search?q=C+ma++ ডিরেক্টরি তৈরি করে গুগলে বা এমনকি এখানে সমাধান খুঁজে পেতে পারেন । যাইহোক, আমি যে ছেলেটি ভোট দিয়েছি তা আমি নই।
fsonmezay

আপনার এতক্ষণের কোডটি দেখানোর জন্য দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন । আপনার যে কোডটির সাথে সমস্যা হচ্ছে তার কমপক্ষে একটি আউটলাইন (তবে তবে একটি সংখ্যার কম সংখ্যক পুনরায় উত্পাদনযোগ্য উদাহরণ ) অন্তর্ভুক্ত করা উচিত , তবে আমরা নির্দিষ্ট সমস্যাটি নিয়ে সহায়তা করার চেষ্টা করতে পারি। আপনার জিজ্ঞাসা করা উচিত কিভাবে জিজ্ঞাসা
টবির স্পিড 11

উত্তর:


149

statডিরেক্টরিটি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন ,

এবং mkdir, একটি ডিরেক্টরি তৈরি করতে।

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

if (stat("/some/directory", &st) == -1) {
    mkdir("/some/directory", 0700);
}

আপনি এই ফাংশনগুলির ম্যানুয়ালটি আদেশ man 2 statএবং man 2 mkdirকমান্ডের সাহায্যে দেখতে পাবেন।


5
আমি বিশ্বাস করি mkdirলিনাক্সের অধীনে একটি দ্বিতীয় প্যারামিটারও modeপ্রয়োজন path
পল আর

4
@ ইউকু: কোনও ফাংশনে একটি ভুল সংখ্যক পরামিতি অতিক্রম করা অপরিজ্ঞাত আচরণ, সুতরাং এটি যখন আপনার পক্ষে এক নজরে কাজ করতে পারে তখন আপনার উপর নির্ভর করা উচিত নয়।
পল আর

4
ডিরেক্টরিটি তৈরি করার আগে এটির অস্তিত্ব নেই কিনা তা পরীক্ষা করে দেখার উদ্দেশ্য কী? এমনকি স্ট্যাট যদি বলে যে এটি এখনও বিদ্যমান নেই তবে এর মধ্যে অন্য একটি প্রক্রিয়া এটি তৈরি করতে পারে।
ব্র্যান্ডিন

4
@ ব্র্যান্ডিন আমি অনুমান করি যে আমি অন্ধভাবে ওপি-র প্রশ্নের উত্তর দিয়েছি :) আপনি দৌড়ের অবস্থা সম্পর্কে ঠিক বলেছেন।
অর্ণাড লে ব্ল্যাঙ্ক

4
এটি বেশিরভাগ ভাল স্থিতিশীল বিশ্লেষকরা
টেকটিউইউ

22

আপনি এমকেডির ব্যবহার করতে পারেন:

$ man 2 mkdir

#include <sys/stat.h>
#include <sys/types.h>

int result = mkdir("/home/me/test.txt", 0777);

এটি কি বিদ্যমান ডিরেক্টরিগুলি সরিয়ে এবং প্রতিস্থাপন করবে?
jjxtra

@jjxtra :: না, ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে এটি ব্যর্থ হওয়া উচিত যেমন আপনি কমান্ড লাইন থেকে একই ক্রিয়াকলাপটি চেষ্টা করেছিলেন।
পল আর

এটাই আমি অনুমান করতাম। স্ট্যাট চেক এড়িয়ে কোনও পারফরম্যান্সের সমস্যা এবং প্রতিবার কেবল এমকিডিয়ার?
jjxtra

@jjxtra: আপনি হাজার হাজার ডিরেক্টরি তৈরি না করলে আমি ভাবতে পারি না যে পরিমাপযোগ্য পারফরম্যান্সের কোনও পার্থক্য থাকবে।
পল আর

7

আমি একটি প্রোগ্রাম লিখতে চাই যা (...) এর ভিতরে ডিরেক্টরি এবং একটি (...) ফাইল তৈরি করে

কারণ এটি একটি খুব সাধারণ প্রশ্ন, এখানে একাধিক স্তরের ডিরেক্টরি তৈরি করার কোড এবং কল ফোপেনের চেয়ে কোড রয়েছে। আমি প্রিন্টফের সাহায্যে ত্রুটি বার্তা প্রিন্ট করতে একটি gnu এক্সটেনশন ব্যবহার করছি।

void rek_mkdir(char *path) {
    char *sep = strrchr(path, '/');
    if(sep != NULL) {
        *sep = 0;
        rek_mkdir(path);
        *sep = '/';
    }
    if(mkdir(path, 0777) && errno != EEXIST)
        printf("error while trying to create '%s'\n%m\n", path); 
}

FILE *fopen_mkdir(char *path, char *mode) {
    char *sep = strrchr(path, '/');
    if(sep) { 
        char *path0 = strdup(path);
        path0[ sep - path ] = 0;
        rek_mkdir(path0);
        free(path0);
    }
    return fopen(path,mode);
}

4
শুধু আমার 5 সেন্ট - দিরের জন্য 0777 মোডটি পছন্দসই নয় - সম্ভবত 0755 ভাল, বা এমনকি পরামিতি দিয়ে যেতে পারে?
ivan.ukr

@ ivan.ukr 0777 সঠিক, মোডটি ব্যবহারকারীদের দ্বারা পরিবর্তন করা হবে mas যেমন umask 022 জন্য এটি 755 অথবা umask 007 মধ্যে 770. জন্য ফলাফল
imix
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.