सी

2012-11-25 5 views
14

में ls -al कमांड को कार्यान्वित करना मेरी कक्षाओं में से किसी एक से असाइनमेंट के हिस्से के रूप में, मुझे ls -al कमांड के परिणामों को डुप्लिकेट करने के लिए सी में एक प्रोग्राम लिखना होगा। मैंने आवश्यक सामग्रियों पर पढ़ा है लेकिन मुझे अभी भी सही आउटपुट नहीं मिल रहा है। यहां मेरा कोड अभी तक है, इसे केवल फ़ाइल आकार और फ़ाइल नाम मुद्रित करना चाहिए, लेकिन फाइल का आकार इसकी प्रिंटिंग सही नहीं है।सी

कोड:

[[email protected] ~]# ./a.out Downloads 
4096 .. 
4096 hw22.c 
4096 ankur.txt 
4096 . 
4096 destination.txt 

यहाँ कर रहे हैं सही आकार:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main(int argc, char* argv[]) 
{ 
    DIR *mydir; 
    struct dirent *myfile; 
    struct stat mystat; 

    mydir = opendir(argv[1]); 
    while((myfile = readdir(mydir)) != NULL) 
    { 
     stat(myfile->d_name, &mystat);  
     printf("%d",mystat.st_size); 
     printf(" %s\n", myfile->d_name); 
    } 
    closedir(mydir); 
} 

ये कोड को क्रियान्वित करने के बाद मेरे परिणाम हैं

[[email protected] ~]# ls -al Downloads 
total 20 
drwxr-xr-x. 2 root root 4096 Nov 26 01:35 . 
dr-xr-x---. 24 root root 4096 Nov 26 01:29 .. 
-rw-r--r--. 1 root root 27 Nov 21 06:32 ankur.txt 
-rw-r--r--. 1 root root 38 Nov 21 06:50 destination.txt 
-rw-r--r--. 1 root root 1139 Nov 25 23:38 hw22.c 

कर सकते हैं किसी को भी अपनी गलती का कहना है कृपया।

धन्यवाद,

अंकुर

+2

मेरे लिए ठीक काम करता है। एक त्रुटि है या नहीं, यह देखने के लिए stat() के वापसी मान की जांच करें। – Neal

+1

यहां भी ठीक काम करता है। सबकुछ (opendir(), readdir(), stat()) के लिए त्रुटि जांच का परिचय दें। –

+0

यदि आप इसे '.' पर चलाते हैं तो ठीक काम करता है, लेकिन अगर आप इसे दूसरी निर्देशिका नहीं देते हैं। –

उत्तर

13

myfile->d_name फ़ाइल नाम नहीं पथ है, तो आप, निर्देशिका के लिए फ़ाइल नाम संलग्न करने के लिए "Downloads/file.txt" पहले की जरूरत है अगर यह कार्यशील निर्देशिका नहीं है:

char buf[512];  
while((myfile = readdir(mydir)) != NULL) 
{ 
    sprintf(buf, "%s/%s", argv[1], myfile->d_name); 
    stat(buf, &mystat); 
.... 

के रूप में क्यों यह प्रिंट 4096 है कि करने के लिए पर अंतिम कॉल से . और .. लिंक का आकार।

नोट: यदि आप एक बफर काफी बड़ी निर्देशिका का नाम धारण करने के लिए आवंटित करना चाहिए, फ़ाइल NULL बाइट और विभाजक, इस

strlen(argv[1]) + NAME_MAX + 2; 
+0

के रूप में चलाने के लिए 'सुडो' का उपयोग करता हूं, आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद, आपके सुझाए गए जोड़ों को काम करते हुए। कार्यक्रम अब सही फ़ाइल आकार दे रहा है। धन्यवाद। – ankur3000

+0

@ ankur3000 आपका स्वागत है, मैंने जो नोट जोड़ा है उसे भी चेक करें। – iabdalkader

+0

यह मेरे ओएस पेपर करते समय अविश्वसनीय उपयोगी है कि मुझे कर्नेल 2.6.39 में क्यूमु के साथ अनुकरण करने के लिए और केवल एक init में ड्राइवर स्थापित करने की आवश्यकता है .. मुझे अभी भी कुछ नहीं पता लेकिन धन्यवाद !! haha !! –

0

दिक्कत यह है कि आप stat("ankur.txt", &mystat), तो आप फ़ाइल "Downloads/ankur.txt" पर काम नहीं कर रहे है। सबसे अधिक संभावना है, stat() असफल रहा है; वैकल्पिक रूप से, यह एक अलग फ़ाइल पर रिपोर्टिंग कर रहा है।

परिणामस्वरूप, आपको यह देखने की आवश्यकता है कि आपका सिस्टम fstatat() का समर्थन करता है - POSIX 2008 में नया - या निर्देशिका के नाम से फ़ाइल का नाम उपसर्ग करने की व्यवस्था करता है।

1

जैसा कोई नाम मेरा मानना ​​है कि आप देखेंगे कि अगर आप ./a.out . आप आपको वह व्यवहार मिलेगा जो आप उम्मीद करते हैं।

आपके पास थोड़ी सूक्ष्म बग है, यदि आप stat(2) पर अपने कॉल के रिटर्न कोड की जांच करते हैं तो देखा जा सकता है।

मौलिक गलती: dirent रों readdir(2) (अपने कोड में myfile) द्वारा दिया mydir करने के लिए एक d_name रिश्तेदार होगा। आपका कोड stat.. पहले, सफल होगा, और इसलिए mystat.. के लिए मान्य डेटा होगा, तो stat(2) के बाद के सभी कॉल विफल हो जाएगा, -1 है, जो आप के लिए जाँच नहीं है, इसलिए mystat संशोधित नहीं किया जा जाएगा लौटने, और आप प्रिंट होगा पुराने मूल्य के लिए st_size, यानी .. का।

+0

आपके उत्तर के लिए धन्यवाद, अब मुझे अपने कोड में समस्या दिखाई दे रही है। लेकिन वास्तव में ऐसा क्यों होता है? मैंने सोचा कि जब हम opendir() कमांड निष्पादित करते हैं, तो प्रोग्राम स्वचालित रूप से उस निर्देशिका के लिए फ़ाइल पथ समायोजित कर रहा है। – ankur3000

-5

या शायद सिस्टम ("ls -al") भी काम करेगा!

+1

यह सवाल का जवाब नहीं दे रहा है। – Puriney

6

यह अंतिम कोड है जिसे मुझे रुचि रखने वाले किसी भी व्यक्ति के लिए काम करना है। यह सही फ़ाइल आकार प्रिंट करता है। जवाब देने के लिए प्रश्नकर्ता और मक्स को क्रेडिट जाता है, बस कोड को एक साथ रखता है। इनपुट मुझे यह काम करने के लिए मिला है "./main।" ।

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main(int argc, char* argv[]) 
{ 
    DIR *mydir; 
    struct dirent *myfile; 
    struct stat mystat; 

    char buf[512]; 
    mydir = opendir(argv[1]); 
    while((myfile = readdir(mydir)) != NULL) 
    { 
     sprintf(buf, "%s/%s", argv[1], myfile->d_name); 
     stat(buf, &mystat); 
     printf("%zu",mystat.st_size); 
     printf(" %s\n", myfile->d_name); 
    } 
    closedir(mydir); 
}