2011-07-24 13 views
5

यहाँ कोड मैं के साथ शुरुआत की है:नाम बदलने के बाद जावा में एक फ़ाइल की अंतिम संशोधित समय निर्धारित करने की कोशिश कर रहा है यह

long modifiedTime = [some time here]; 
File oldFile = new File("old_name.txt"); 
boolean renamed = oldFile.renameTo(new File("new_name.txt"); 
boolean timeChanged = oldFile.setLastModified(modifiedTime); 

System.out.println("renamed: " + renamed); 
System.out.println("time changed: " + timeChanged); 

और उत्पादन मैंने देखा था:

renamed: true 
time changed: false 

लेकिन जब मैंने कोशिश की:

long modifiedTime = [some time here]; 
boolean renamed = new File("old_name.txt").renameTo(new File("new_name.txt")); 
boolean timeChanged = new File("new_name.txt").setLastModified(modifiedTime); 

System.out.println("renamed: " + renamed); 
System.out.println("time changed: " + timeChanged); 

यह ठीक काम करने लग रहा था,

renamed: true 
time changed: true 

क्यों कि दूसरा दृष्टिकोण से काम करता है यह है, और पहले एक नहीं करता है: इस निर्गम के साथ?

उत्तर

4

पहले मामले में आप फ़ाइल की अंतिम संशोधित विशेषता को बदलने की कोशिश कर रहे हैं जो अब मौजूद नहीं है! क्योंकि आपने अभी इसका नाम बदल दिया है। दूसरे मामले में आप मौजूदा वैध फ़ाइल की विशेषता बदल रहे हैं।

ऐसा इसलिए होता है क्योंकि जावा क्लास फ़ाइल मूल आदेशों पर एक पतली आवरण है। यदि आपने उदाहरण old = new File("oldname") बनाया है, तो rename कहा जाता है और फिर old उदाहरण पर कुछ विधि का आह्वान किया जाता है, यह वास्तव में सिस्टम कॉल करता है और फ़ाइल नाम और कमांड दोनों भेजता है। लेकिन इस बिंदु पर फ़ाइल का नाम अप्रासंगिक है।

मुझे आशा है कि अब यह स्पष्ट है।

+1

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

1

File एक फ़ाइल या निर्देशिका के पथ का प्रतिनिधित्व करता है जो मौजूद हो सकता है या नहीं।

जब आप किसी फ़ाइल का नाम बदलते हैं, तो मूल नाम वाली कोई फ़ाइल नहीं होती है।

2

oldFile.renameTo(new File("new_name.txt"));oldFile अंक कहां नहीं बदलता है। उस कॉल के बाद oldFile का पथ अभी भी old_name.txt है।

तो setLastModified कॉल विफल रहता है क्योंकि old_name.txt उस समय मौजूद नहीं है।