2011-05-08 11 views
7

मैं उन फ़ाइलों के बैच के साथ काम कर रहा हूं जिनमें एक ही वस्तु के बारे में जानकारी उनके जीवन के अलग-अलग समय पर होती है, और उन्हें आदेश देने का एकमात्र तरीका सृजन तिथि से होता है। मैं इस उपयोग कर रहा था:लिनक्स में फ़ाइल निर्माण दिनांक कैसे प्राप्त करें?

//char* buffer has the name of file 
struct stat buf; 
FILE *tf; 
tf = fopen(buffer,"r"); 
//check handle 
fstat(tf, &buf); 
fclose(tf); 
pMyObj->lastchanged=buf.st_mtime; 

लेकिन वह काम करने के लिए लगता है नहीं करता है। मैं क्या गलत कर रहा हूँ? लिनक्स के तहत फ़ाइल निर्माण दिनांक प्राप्त करने के लिए अन्य, अधिक विश्वसनीय/सरल तरीके हैं?

+3

'fstat' एक" फ़ाइल बनाई "टाइमस्टैम्प मूल्य लाने नहीं है क्योंकि कई फ़ाइल सिस्टम डॉन ' उस डेटा को ट्रैक न करें। आप किस फाइल सिस्टम के साथ काम कर रहे हैं? –

+0

जो कि नवीनतम उबंटू डेस्कटॉप के लिए मानक है, मुझे लगता है - मैं वर्चुअल मशीन (vmware प्लेयर, सटीक होने के लिए) पर अपना कोड चला रहा हूं, और फाइल सिस्टम जैसे सभी विवरणों को छोड़कर यूबंटू इंस्टॉलर को छोड़ दिया। – Srv19

+0

गैर-उपयोगी के बजाय 'stat (बफर, और buf) 'का प्रयास करें- यहां' fopen' – mpez0

उत्तर

7

फ़ाइल डिस्क्रिप्टर पर fstat काम करता है, फाइल संरचनाओं में नहीं। सबसे सरल संस्करण:

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

#ifdef HAVE_ST_BIRTHTIME 
#define birthtime(x) x.st_birthtime 
#else 
#define birthtime(x) x.st_ctime 
#endif 

int main(int argc, char *argv[]) 
{ 
     struct stat st; 
     size_t i; 

     for(i=1; i<argc; i++) 
     { 
       if(stat(argv[i], &st) != 0) 
         perror(argv[i]); 
       printf("%i\n", birthtime(st)); 
     } 

     return 0; 
} 

आप यह पता लगाने की अगर आपके सिस्टम sys/stat.h निरीक्षण या autoconf निर्माण के कुछ प्रकार का उपयोग करके अपने स्टेट संरचना में st_birthtime है की आवश्यकता होगी।

+0

मैं फ़ाइल डिस्क्रिप्टर कैसे प्राप्त करूं? – Srv19

+1

@ srv19 आप खुले (2) या fileno (tf) का उपयोग कर फ़ाइल डिस्क्रिप्टर प्राप्त कर सकते हैं। जो मैंने आपको दिया है, वह फ़ाइल खोलने के बिना इसके गुणों का निरीक्षण करने का एक तरीका है। यदि आपको वैसे भी फ़ाइल खोलने की आवश्यकता है और stdio फ़ंक्शंस का उपयोग करना चाहते हैं, तो fileno आपका मित्र है। – Mel

+0

आपका समाधान मेरी समस्या से छुटकारा पा लिया। बहुत बहुत धन्यवाद। मुझे संदेह है कि मैं fstat के उपयोग में कुछ मिशन था। – Srv19

5

फ़ाइल बनाना समय कहीं भी संग्रहीत नहीं है, आप केवल निम्न में से एक को पुनः प्राप्त कर सकते हैं:

time_t st_atime; /* time of last access */ 
time_t st_mtime; /* time of last modification */ 
time_t st_ctime; /* time of last status change */ 

आपका कोड आपको पिछली बार बदलने के समय, तथापि देना चाहिए। नोट: फ़ाइल खोलने के बिना fstat() के बजाय आप stat() का उपयोग कर सकते हैं (stat() फ़ाइल नाम को param के रूप में लेता है)।

+0

बह, मैंने अनदेखा किया कि आप डिस्क्रिप्टर के बजाय फ़ाइल सूचक को पास कर रहे हैं :) –

10

struct stat में st_ctime सदस्य st_ctime सदस्य का निकटतम अनुमान struct stat में है, लेकिन वास्तव में यह आखिरी बार इनोड बदल गया है। यदि आप फ़ाइल बनाते हैं और कभी भी इसके आकार या अनुमतियों को संशोधित नहीं करते हैं, जो एक सृजन समय के रूप में कार्य करता है। अन्यथा, कम से कम मानक यूनिक्स सिस्टम में फ़ाइल बनाने के दौरान कोई रिकॉर्ड नहीं है।

अपने उद्देश्यों के लिए, st_mtime द्वारा क्रमबद्ध करें ... या नाम में टाइमस्टैम्प के साथ नाम की गई फ़ाइलों को प्राप्त करें।


ध्यान दें कि यदि आप डार्विन (मैक ओएस एक्स) पर हैं, तो निर्माण समय उपलब्ध है। stat(2) के लिए आदमी पृष्ठ से:

struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is defined */ 
    dev_t   st_dev;   /* ID of device containing file */ 
    mode_t   st_mode;   /* Mode of file (see below) */ 
    nlink_t   st_nlink;   /* Number of hard links */ 
    ino_t   st_ino;   /* File serial number */ 
    uid_t   st_uid;   /* User ID of the file */ 
    gid_t   st_gid;   /* Group ID of the file */ 
    dev_t   st_rdev;   /* Device ID */ 
    struct timespec st_atimespec;  /* time of last access */ 
    struct timespec st_mtimespec;  /* time of last data modification */ 
    struct timespec st_ctimespec;  /* time of last status change */ 
    struct timespec st_birthtimespec; /* time of file creation(birth) */ 
    off_t   st_size;   /* file size, in bytes */ 
    blkcnt_t  st_blocks;  /* blocks allocated for file */ 
    blksize_t  st_blksize;  /* optimal blocksize for I/O */ 
    uint32_t  st_flags;   /* user defined flags for file */ 
    uint32_t  st_gen;   /* file generation number */ 
    int32_t   st_lspare;  /* RESERVED: DO NOT USE! */ 
    int64_t   st_qspare[2];  /* RESERVED: DO NOT USE! */ 
}; 

नोट st_birthtimespec क्षेत्र:

हालांकि, जब मैक्रो _DARWIN_FEATURE_64_BIT_INODE परिभाषित किया गया है, स्टेट संरचना अब के रूप में परिभाषित किया जाएगा। ध्यान दें, कि हर बार struct timespec मानों में हैं, इसलिए उप-सेकंड समय (tv_nsec नैनोसेकंद रिज़ॉल्यूशन देता है)। POSIX 2008 <sys/stat.h> को मानक समय पर struct timespec समय की आवश्यकता होती है; डार्विन उस का पालन करता है।

+0

अफसोस की बात है, फाइलें किसी अन्य एप्लिकेशन द्वारा बनाई गई हैं। अफसोस की बात है, मुझे इसके बारे में कुछ भी बदलने की अनुमति नहीं मिली है। – Srv19

6

लिनक्स में फ़ाइल निर्माण तिथि पाने के लिए, मैं निम्नलिखित विधि का उपयोग

[email protected]# cat <<_eof> test.txt 
> Hello 
> This is my test file 
> _eof 
[email protected]# cat test.txt 
Hello 
This is my test file 
[email protected]# ls -i test.txt 
2097517 test.txt 
[email protected]# debugfs -R 'stat <2097517>' /dev/sda5 

Inode: 2097517 Type: regular Mode: 0664 Flags: 0x80000 
Generation: 4245143992 Version: 0x00000000:00000001 
User: 1000 Group: 1000 Size: 27 
File ACL: 0 Directory ACL: 0 
Links: 1 Blockcount: 8 
Fragment: Address: 0 Number: 0 Size: 0 
ctime: 0x50ea6d84:4826cc94 -- Mon Jan 7 12:09:00 2013 
atime: 0x50ea6d8e:75ed8a04 -- Mon Jan 7 12:09:10 2013 
mtime: 0x50ea6d84:4826cc94 -- Mon Jan 7 12:09:00 2013 
crtime: 0x5056d493:bbabf49c -- Mon Sep 17 13:13:15 2012 
Size of extra inode fields: 28 
EXTENTS: 
(0):8421789 

atime: पिछली बार फ़ाइल खोला गया था या मार डाला

ctime: समय inode जानकारी अपडेट किया गया।जब फ़ाइल संशोधित किया गया है

mtime ctime भी अद्यतन हो जाता है: अंतिम संशोधित समय

crtime: फ़ाइल बनाना समय

+2

आपके उत्तर के लिए धन्यवाद, लेकिन मुझे ध्यान रखना चाहिए कि मेरा प्रश्न लिनक्स कोर सी कार्यों के उपयोग के बारे में था, न कि शैल में निर्माण समय कैसे प्राप्त करें। – Srv19

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