सी प्रोग्राम में डायरेक्टरी में फाइलों को कैसे लिस्ट करें?


88

मैं लिनक्स पर एक ftp सर्वर लिखने की कोशिश कर रहा हूँ। इस मामले में मैं एक सी प्रोग्राम द्वारा टर्मिनल पर निर्देशिका में फ़ाइलों को कैसे सूचीबद्ध कर सकता हूं? हो सकता है कि मैं कमांड खोजने के लिए फंक्शन फ़ंक्शन का उपयोग कर सकता हूं, लेकिन मैं क्लाइंट प्रोग्राम भेजने के लिए एक स्ट्रिंग के रूप में फ़ाइल का नाम चाहता हूं। मैं यह कैसे कर सकता हूँ?

जवाब के लिए धन्यवाद।

जवाबों:


175

एक उदाहरण, POSIX आज्ञाकारी प्रणालियों के लिए उपलब्ध:

/*
 * This program displays the names of all files in the current directory.
 */

#include <dirent.h> 
#include <stdio.h> 

int main(void) {
  DIR *d;
  struct dirent *dir;
  d = opendir(".");
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }
    closedir(d);
  }
  return(0);
}

खबरदार कि इस तरह का ऑपरेशन सी में निर्भर मंच है।

स्रोत: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046380353&id=1044780608


यह अब ठीक है और इतना आसान है। उत्तर के लिए धन्यवाद फिर से।
cemal

13
कृपया इसे मान्य करें यदि आपको यह पसंद आया हो;)
जीन-बर्नार्ड जाॅनसन

1
महान, लेकिन क्या होगा अगर हम केवल pngफाइलें चाहते हैं?
फ़रिश

2
@ फारशेड: यह कोशिश करो ।
फ्राक्षिल

मैं इसके साथ कुछ समस्याओं का सामना करता हूं। प्रथम, "।" और ".." हर निर्देशिका के शीर्ष पर दिखाई देते हैं, और यद्यपि वे "निर्देशिका" हैं, उनके पास dir-> d_type द्वारा DT_REG पर सेट है। भी, मैं सभी फ़ाइलों को प्राप्त करने के लिए प्रतीत नहीं होता ... क्या कहीं अधिक व्यापक "निर्देशिका स्कैनर" कोड है? शायद "एलएस" के कुछ गरीब-आदमी कार्यान्वयन? मुझे इसकी आवश्यकता मैक - OS-X
Motti Shneor

35

जेबी जानसन के जवाब के लिए एक छोटा सा जोड़ - मुख्य readdir()लूप में मैं इसे जोड़ूंगा:

  if (dir->d_type == DT_REG)
  {
     printf("%s\n", dir->d_name);
  }

बस जाँच कर रहा है कि क्या यह वास्तव में फ़ाइल है, लिंक (सिम्पल) लिंक, डायरेक्टरी या जो भी हो।

नोट: प्रलेखन के बारे struct direntमें अधिक ।libc


6
बस एक तरफ: सभी प्लेटफ़ॉर्म नहीं भरेंगे d_type, लेकिन लिनक्स और बीएसडी करेंगे (मुझे पता है कि सवाल लिनक्स को टैग किया गया है, बस जवाब पर थोड़ा विस्तार करना); फिर भी, सभी फाइल सिस्टम को समान रूप से समर्थित नहीं किया जाता है , हालांकि इसे अधिकांश एफएस के साथ काम करना चाहिए।
सर्वव्यापी जुलाब

11

यहाँ एक पूरा कार्यक्रम है कि फ़ोल्डर की सामग्री को पुन: कैसे सूचीबद्ध किया जाए:

#include <dirent.h> 
#include <stdio.h> 
#include <string.h>

#define NORMAL_COLOR  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"



/* let us make a recursive function to print the content of a given folder */

void show_dir_content(char * path)
{
  DIR * d = opendir(path); // open the path
  if(d==NULL) return; // if was not able return
  struct dirent * dir; // for the directory entries
  while ((dir = readdir(d)) != NULL) // if we were able to read somehting from the directory
    {
      if(dir-> d_type != DT_DIR) // if the type is not directory just print it with blue
        printf("%s%s\n",BLUE, dir->d_name);
      else
      if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 ) // if it is a directory
      {
        printf("%s%s\n",GREEN, dir->d_name); // print its name in green
        char d_path[255]; // here I am using sprintf which is safer than strcat
        sprintf(d_path, "%s/%s", path, dir->d_name);
        show_dir_content(d_path); // recall with the new path
      }
    }
    closedir(d); // finally close the directory
}

int main(int argc, char **argv)
{

  printf("%s\n", NORMAL_COLOR);

    show_dir_content(argv[1]);

  printf("%s\n", NORMAL_COLOR);
  return(0);
}

4

नीचे कोड केवल डायरेक्टरी के भीतर फाइलें प्रिंट करेगा और ट्रैवर्सिंग करते समय दी गई डायरेक्टरी के भीतर डायरेक्टरी को बाहर करेगा।

#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include<string.h>
int main(void)
{
    DIR *d;
    struct dirent *dir;
    char path[1000]="/home/joy/Downloads";
    d = opendir(path);
    char full_path[1000];
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            //Condition to check regular file.
            if(dir->d_type==DT_REG){
                full_path[0]='\0';
                strcat(full_path,path);
                strcat(full_path,"/");
                strcat(full_path,dir->d_name);
                printf("%s\n",full_path);
            }
        }
        closedir(d);
    }
    return(0);     
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.