2012-05-04 19 views
8

में फ़ाइल का अंतिम संशोधित समय प्राप्त करें मैं एक सी प्रोग्राम पर काम कर रहा हूं जहां मुझे फ़ाइल का अंतिम संशोधित समय प्राप्त करने की आवश्यकता है। प्रोग्राम क्या करता है एक फ़ंक्शन निर्देशिका के भीतर प्रत्येक फ़ाइल के माध्यम से लूप करता है और जब कोई विशेष फ़ाइल पाई जाती है तो यह फ़ाइल के अंतिम संशोधित समय की जांच करने के लिए एक और फ़ंक्शन कॉल करता है।लिनक्स

निर्देशिका के भीतर वहाँ एक mylog.txt.1, mylog.txt.2 और mylog.txt.3 आदि मैं का उपयोग कर डालूँगा आदेश मैं देख सकता हूँ कि mylog.txt.1 और mylog.txt.2 4 थी मई को संशोधित किया गया और mylog.txt.3 3 मई को संशोधित किया गया था लिनक्स में निर्देशिका की सूची जब है।

जब कार्यक्रम इन फ़ाइलों में से प्रत्येक को जांचता है, तो यह हमेशा तीसरा मई लौटा रहा है। नीचे वह कोड है जिसका मैं उपयोग कर रहा हूं।

void getFileCreationTime(char *filePath) 
{ 
    struct stat attrib; 
    stat(filePath, &attrib); 
    char date[10]; 
    strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime))); 
    printf("The file %s was last modified at %s\n", filePath, date); 
    date[0] = 0; 
} 

मैं st_ctime, अर्थात st_mtime और st_atime के सभी विभिन्न रूपों की कोशिश की है लेकिन वे सभी वापसी 3 हो सकता है।

आपकी सहायता के लिए धन्यवाद।

+0

शायद सफाई पहले: क्यों 'strftime' करने के लिए 20 की एक आकार पारित जबकि बफर 10 लंबा है? 'stat' के वापसी मूल्य की जांच क्यों न करें? यदि 'stat' विफल हो जाता है, तो आप कचरा मूल्य पार्स कर रहे हैं। – mvds

+0

@mvds क्षमा करें कि एक टाइपो – Boardy

+0

यह सुनिश्चित कर लें कि आप अलग-अलग फ़ाइलपैथ पास कर रहे हैं, "attrib.st_ctime" "अंतिम स्थिति परिवर्तन का समय" देगा, यदि आप "अंतिम संशोधन का समय" ढूंढ रहे हैं तो आपको " attrib.st_mtime " – ray

उत्तर

9

यह उन मामलों में से एक है जहां टाइमज़ोन महत्वपूर्ण हैं। आपको st_mtime के gmtime मिल रहे हैं। आपको इसके बजाय localtime का उपयोग करना चाहिए।

strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime))); 

इस वजह ls आपके समय क्षेत्र जानकारी का उपयोग करता है, और जब आप प्रदर्शन के भाग के रूप gmtime इस्तेमाल किया, यह जानबूझ कर किसी भी समय क्षेत्र जानकारी छोड़ दिया गया है।

+1

मैं अभी भी आपके फ़ंक्शन में बहुत अधिक त्रुटि जांचने की अनुशंसा करता हूं, हालांकि – Petesh

3

हालात ठीक करने के लिए:

  • उचित क्षेत्र है, यानी st_ctime का प्रयोग करें।
  • जांचें कि stat() इसके परिणाम का उपयोग करने से पहले सफल होता है।
  • गलत बफर आकार का उपयोग करने के जोखिम को हटाने के लिए strftime(date, sizeof date, ... का उपयोग करें।

मैं सबसे पहले संदिग्ध है कि आपके फाइल सिस्टम बस अंतिम संशोधित समय पर नज़र रखने का समर्थन नहीं किया है, लेकिन जब से तुम कहना है कि अन्य उपकरणों यह दिखाने के लिए प्रबंधन, मुझे लगता है कोड किसी भी कारण से टूट रहा है।

क्या यह हो सकता है कि फ़ाइल नाम पूर्ण पथ नाम नहीं हैं, यानी वे उचित निर्देशिका उपसर्ग शामिल नहीं करते हैं?

9

यह मेरे लिए ठीक काम किया:

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

void getFileCreationTime(char *path) { 
    struct stat attr; 
    stat(path, &attr); 
    printf("Last modified time: %s", ctime(&attr.st_mtime)); 
}