2013-04-21 10 views
6

पर ctime या "चेंज टाइम" विशेषता को सेट/बदलना java.nio.Files कक्षा का उपयोग कर जावा में फ़ाइलों पर टाइमस्टैम्प मेटाडेटा को बदलना चाहता हूं।फ़ाइल

मैं सभी 3 लिनक्स/ext4 timestamps परिवर्तन करना चाहते हैं (अंतिम बार संशोधित, उपयोग, और परिवर्तित)। फाइल पर समय:

Files.setLastModifiedTime(pathToMyFile, myCustomTime); 
Files.setAttribute(pathToMyFile, "basic:lastAccessTime", myCustomTime); 

हालांकि, मैं पिछले बदलें संशोधित असमर्थ हूँ:

मैं इस प्रकार है पहले दो टाइमस्टैम्प क्षेत्रों को बदलने में सक्षम हूं। इसके अलावा, यह विषय में कोई बदलाव नहीं आया है टाइमस्टैम्प documentation में उल्लेख किया है कि वहाँ। निकटतम उपलब्ध विशेषता creationTime है, जो मैं किसी भी सफलता के बिना की कोशिश की है।

कैसे जावा में एक कस्टम टाइमस्टैम्प के अनुसार किसी फ़ाइल के लिए Change: मेटाडाटा को संशोधित करने पर कोई भी विचार?

धन्यवाद!

+0

लिनक्स टर्मिनल में, ls उत्पादन के लिए, यह अंतिम संशोधित समय आप की कोशिश की थी पता चलता है, कि संशोधित? –

+0

हां। मैंने ऊपर दिए गए कोड की पहली पंक्ति का उपयोग करके अंतिम संशोधित समय को सफलतापूर्वक संशोधित किया। – Eitan

उत्तर

10

मैं दो अलग अलग तरीकों के साथ ctime संशोधित करने में सक्षम था:

  1. ताकि ctimemtime
  2. एक सरल (लेकिन hacky) खोल स्क्रिप्ट लेखन से मेल खाता गिरी बदल रहा है।

पहला तरीका: कर्नेल बदलना।

मैं KERNEL_SRC/fs/attr.c में बस कुछ ही लाइनों बदलाव इस संशोधन mtime है जब भी mtime मैच के लिए ctime अद्यतन करता है "स्पष्ट रूप से परिभाषित।"

लिनक्स में:

touch -m --date="Wed Jun 12 14:00:00 IDT 2013" filename 

जावा में (जावा 6 या 7, और शायद दूसरों का प्रयोग करके):

वहाँ "स्पष्ट रूप से परिभाषित" के लिए कई तरीके mtime, उदाहरण के लिए कर रहे हैं

01:
long newModificationTime = TIME_IN_MILLIS_SINCE_EPOCH; 
File myFile = new File(myPath); 
newmeta.setLastModified(newModificationTime); 

यहाँ notify_change समारोह में KERNEL_SRC/fs/attr.c करने के लिए परिवर्तन है

(1) यह लाइन, असम्बद्ध, फ़ाइल में बदलाव पर वर्तमान घड़ी के समय में सीटा को अपडेट करेगी। हम यह नहीं चाहते हैं, क्योंकि हम खुद को सीटा सेट करना चाहते हैं। इस प्रकार, हम इस लाइन पर टिप्पणी करते हैं। (यह अनिवार्य नहीं है)

(2) यह वास्तव में समाधान का क्रूक्स है।notify_change समारोह एक फ़ाइल के बाद मार डाला जाता है, बदल दिया गया है, जहां समय मेटाडाटा अपडेट करने की आवश्यकता है। यदि कोई mtime निर्दिष्ट नहीं किया गया था, तो mtime वर्तमान समय पर सेट है। अन्यथा, अगर mtime को किसी विशिष्ट मान पर सेट किया गया था, तो हम उस मान पर ctime और atime भी सेट करते हैं।

2 विधि: सरल (लेकिन hacky) खोल स्क्रिप्ट।

संक्षिप्त विवरण: 1) अपने लक्ष्य समय 2) फ़ाइल पर एक chmod प्रदर्शन के लिए परिवर्तित करें सिस्टम का समय, फ़ाइल ctime अब लक्ष्य समय 3) वापस जाएं प्रणाली समय को दर्शाता है।

changectime.sh

#!/bin/sh 
now=$(date) 
echo $now 
sudo date --set="Sat May 11 06:00:00 IDT 2013" 
chmod 777 $1 
sudo date --set="$now" 

भागो इस रूप में इस प्रकार है: ./changectime.sh myFile

फ़ाइल के ctime अब फाइल में समय दिखाएंगे।

बेशक, आप शायद नहीं 777 अनुमति के साथ फ़ाइल चाहते हैं। यह सुनिश्चित करने से पहले कि आप इस स्क्रिप्ट को अपनी आवश्यकताओं के अनुसार संशोधित करते हैं, सुनिश्चित करें।

+0

स्क्रिप्ट बदलने की आवश्यकता है। अब = $ (दिनांक) सेटिंग (हमेशा?) को सेटिंग के लिए मान्य दिनांक प्रारूप नहीं मिलता है। उपयोग करें: अब = $ (दिनांक + "% वाई-% एम-% डी% टी")। वह स्क्रिप्ट/विधि साफ है और यह मेरे लिए काम करती है। – gaoithe

2

अपने मामले को this answer अनुकूल:

// Warning: Disk must be unmounted before this operation 
String disk = "/dev/sda1"; 
// Update ctime 
Runtime.getRuntime().exec("debugfs -w -R 'set_inode_field "+pathToMyFile+" ctime "+myCustomTime+"' "+disk); 
// Drop vm cache so ctime update is reflected 
Runtime.getRuntime().exec("echo 2 > /proc/sys/vm/drop_caches"); 

मैं पर शक है हम मानक जावा एपीआई में एक सुविधाजनक तरीका यह करने के लिए देखेंगे न लिनक्स (आदमी स्पर्श) और न ही विंडोज (GetFileTime समारोह के रूप में, एमएसडीएन) इस क्षेत्र में आसान पहुंच प्रदान करते हैं। मूल प्रणाली कॉल केवल सृजन/पहुंच/टाइमस्टैम्प को संशोधित करने के लिए पहुंच प्रदान करती है, इसलिए जावा भी करता है।

+0

वहाँ एक वैकल्पिक तरीका जो मुझे डिस्क घुड़सवार रखने के लिए अनुमति देता है है? – Eitan