2012-01-23 22 views
44

मुझे opendir/readdir का उपयोग कर लिनक्स जैसी प्रणाली पर फ़ाइलों की एक सूची मिल रही है। ऐसा प्रतीत होता है कि निर्देशिका प्रविष्टियों को फ़ाइल नाम के वर्णमाला क्रम में वापस कर दिया जाता है। हालांकि, मुझे इस आदेश की गारंटी के बारे में मैन पेजों में कुछ भी दिखाई नहीं देता है।क्या readdir() ऑर्डर की गारंटी देता है?

क्या कोई मुझे बता सकता है कि क्या गारंटी देने वाले गारंटियों को आदेश दिया गया है या नहीं?

+0

अंगूठे के नियम के रूप में, बाधाएं हैं अगर यह दस्तावेज़ीकरण में नहीं है, तो जवाब नहीं है। यहां तक ​​कि अगर सभी कार्यान्वयन पर एक सतत आदेश हुआ, यदि यह दस्तावेज नहीं है, तो शायद इसकी गारंटी नहीं है। –

+4

यदि वे वर्णानुक्रम से बाहर आ रहे हैं, तो यह लगभग निश्चित रूप से बस है कि वे मूल रूप से * बनाए गए * वर्णमाला क्रम में थे, उदा। 'unzip' या 'tar' द्वारा उन्हें निकालने के द्वारा ...' readdir' कोई ऑर्डर प्रदान नहीं करता है। –

+1

वैसे, 'स्कैंडर' उपयोगी हो सकता है यदि आप परिणामों को ऑर्डर करना चाहते हैं या उनके पास यादृच्छिक पहुंच है। यह POSIX 2008 में मानकीकृत है और इससे पहले एक आम विस्तार था। –

उत्तर

34

readdir विधि किसी ऑर्डरिंग की गारंटी नहीं देती है। यदि आप यह सुनिश्चित करना चाहते हैं कि उन्हें वर्णानुक्रम में क्रमबद्ध किया गया है तो आपको ऐसा करने की आवश्यकता होगी।

नोट: मैंने निश्चित दस्तावेज के लिए थोड़ा सा खोज की है कि यह मामला है। निकटतम मैं आया नीचे दिए गए लिंक

कोई निश्चित अर्थ है, लेकिन यह आदेश का एक अच्छा सिंहावलोकन देता है द्वारा यह है, यह इतिहास है और यह कैसे कार्यान्वयन है आम तौर पर ट्रेवर्सल आदेश है।

8

यह स्पष्ट रूप से गारंटी नहीं है। ऑर्डरिंग अक्सर कुछ नियमों का पालन करती है, लेकिन नियम इतने जटिल हैं कि आपको उन पर भरोसा नहीं करना चाहिए। आदेश, उदाहरण के लिए, एक ही निर्देशिका में होने वाले अन्य परिचालनों से प्रभावित हो सकता है, और आप उन पर नियंत्रण नहीं कर सकते हैं। आदेश को यादृच्छिक रूप से मानें, और यदि आपको आवश्यकता हो तो चीजों को स्वयं क्रमबद्ध करें।

6

नहीं, readdir किसी भी आदेश की गारंटी नहीं देता है।

संक्षेप में (कुछ फाइल सिस्टम एक निश्चित क्रम में निर्देशिका प्रविष्टियों संग्रहीत कर सकता है, इस तरह के मामलों readdir उसी क्रम में आप के लिए उन्हें वापस कर सकती है, लेकिन है कि readdir खुद की एक विशेषता नहीं है।)

13

, नहीं, readdir() किसी विशेष आदेश की गारंटी नहीं देता है।

glibc manual

जिस क्रम में फ़ाइलों को एक निर्देशिका में प्रदर्शित में एक readdir उदाहरण से

काफी यादृच्छिक हो जाता है। अधिक उपयोगी कार्यक्रम उन्हें

+3

लिंक विफल रहा। मुझे [web.archive.org] में एक स्नैपशॉट मिला (https://web.archive.org/web/20120531021029/http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02 /library_13.html) रुचि रखने वाले किसी के लिए। – iplus26

9

मुद्रण "लिनक्स प्रोग्रामिंग इंटरफेस" से पहले ( उन्हें alphabetizing से शायद) प्रविष्टियों को क्रमबद्ध होगा:

फ़ाइल नाम readdir द्वारा दिया(), क्रमबद्ध क्रम में नहीं हैं लेकिन बल्कि क्रम में वे निर्देशिका में होते हैं (यह में ऑर्डर पर निर्भर करता है जो फ़ाइल सिस्टम निर्देशिका में फ़ाइलों को जोड़ता है और यह फ़ाइलों को हटाए जाने के बाद निर्देशिका सूची में अंतराल कैसे भरता है)। (कमांड ls -f ही अवर्गीकृत क्रम में फ़ाइलों को सूचीबद्ध करता है कि वे readdir के द्वारा प्राप्त किया जाएगा()।)

हम मिलान प्रोग्रामर से परिभाषित फ़ाइलों की एक क्रमबद्ध सूची प्राप्त करने के समारोह scandir (3) का उपयोग कर सकते मानदंड; विवरण के लिए मैनुअल पेज देखें। हालांकि SUSv3 में निर्दिष्ट नहीं है, स्कैंडर() अधिकांश यूनिक्स कार्यान्वयन पर प्रदान किया जाता है।

2

readdir() ओएस डिस्क पढ़ने के आदेश के ऊपर किसी अन्य क्रम की गारंटी नहीं देता है।


परीक्षण है जो मैं कुछ प्लेटफार्मों पर किए गए के अनुसार - सोलारिस - sun4sol, 86 सोल, लिनक्स, विंडोज नमूना कोड के साथ सभी परिणाम एक यादृच्छिक ढंग से displated रहे थे।


स्रोत: readdir() beginning with dots instead of files

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

int main() { 

    DIR *dir; 
    struct dirent *dp; 
    char * file_name; 
    char dirpath [100] ; 


    while(1==1){ 
     printf("Choose dir:"); 
     scanf("%s",dirpath); 
     dir = opendir(dirpath); 
     while ((dp=readdir(dir)) != NULL) { 
      if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
      { 
       // do nothing (straight logic) 
      } else { 
       file_name = dp->d_name; // use it 
       printf("file_name: \"%s\"\n",file_name); 
      } 
     } 
     closedir(dir); 
    } 

    return 0; 
} 
1

अन्य उत्तर के अलावा, readdir man page फ़ाइलों आदेश के बारे में बहुत स्पष्ट है।

ऑर्डर जिसमें फ़ाइल नाम पढ़ने के लिए लगातार कॉल द्वारा पढ़े जाते हैं() फाइल सिस्टम कार्यान्वयन पर निर्भर करता है; यह असंभव है कि नाम किसी भी रूप में क्रमबद्ध किए जाएंगे।

कुछ फ़ाइल सिस्टम, जैसे रीइज़रफ़ेस फ़ाइलों को शब्दावली क्रम में सूचीबद्ध करते हैं।

अपने मामले में, आपको नामों को सरणी में संग्रहीत करना होगा, फिर सरणी को सॉर्ट करें।

उदाहरण के लिए, सरणी को सॉर्ट करने के लिए qsort() का उपयोग करें।

संबंधित मुद्दे