2009-08-25 3 views
27

मैं WinXP का उपयोग कर रहा हूं। मैं फ़ाइलों की एक सूची उत्पन्न करने के लिए जावा का उपयोग करता हूं। फ़ाइल को पहले abc.txt.temp के रूप में बनाया जाएगा, और पीढ़ी को पूरा करने के बाद, इसका नाम बदलकर abc.txt कर दिया जाएगा।क्यों पता लगाना क्यों नाम बदलें() विफल?

हालांकि, जब मैं फ़ाइलों को उत्पन्न करता हूं, तो कुछ फ़ाइलों का नाम बदलना विफल रहा। यह यादृच्छिक रूप से होता है।

क्या यह कारण जानने के लिए वैसे भी असफल रहा है?

int maxRetries = 60; 
logger.debug("retry"); 
while (maxRetries-- > 0) 
{ 
    if (isSuccess = file.renameTo(file2)) 
    { 
     break; 
    } 
    try 
    { 
     logger.debug("retry " + maxRetries); 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

//file.renameTo(file2); 
Thread.currentThread().getThreadGroup().getParent().list(); 

और परिणाम:

[DEBUG][2009-08-25 08:57:52,386] - retry 1 
[DEBUG][2009-08-25 08:57:53,386] - retry 0 
java.lang.ThreadGroup[name=system,maxpri=10] 
    Thread[Reference Handler,10,system] 
    Thread[Finalizer,8,system] 
    Thread[Signal Dispatcher,9,system] 
    Thread[Attach Listener,5,system] 
    java.lang.ThreadGroup[name=main,maxpri=10] 
     Thread[main,5,main] 
     Thread[log4j mail appender,5,main] 
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false 

मैं एक व्यवस्थित दृष्टिकोण पता करने के लिए कारण यह पता लगाने करना चाहते हैं। धन्यवाद।

+0

क्या आप फेंकने वाले किसी भी अपवाद को पकड़ रहे हैं? – seth

+0

संख्या। बिल्कुल अपवाद नहीं है। यह केवल झूठी वापसी करता है। – janetsmith

+0

मैंने अपना जवाब अपडेट किया। –

उत्तर

24

यह संभव है कि नाम बदलने का कारण यह है कि फ़ाइल अभी भी खुली है। यहां तक ​​कि अगर आप फ़ाइल बंद कर रहे हैं, यह की वजह से (उदाहरण के लिए) खुला रखा जा सकता:

  1. फ़ाइल पर काम करने के लिए अपने प्रक्रिया का एक उपप्रक्रिया द्वारा विरासत में मिली है
  2. एक एंटी-वायरस प्रोग्राम के लिए फ़ाइल को स्कैन कर रहा है वायरस, और इसलिए यह खुला
  3. एक (जैसे Google डेस्कटॉप या Windows अनुक्रमण सेवा के रूप में) इंडेक्सर है फ़ाइल खुला है

मदद करने के लिए यह पता लगाने क्या फ़ाइल खुला रखते हुए किया गया है, औजारों का उपयोग इस तरह के रूप FileMon और Handle

अद्यतन: अनलॉकर जैसे टूल को मदद नहीं मिल सकती है, अगर फ़ाइल केवल बहुत ही कम समय के लिए खुली होती है (जैसा कि एंटी-वायरस स्कैन के मामले में होता है)। हालांकि, अगर javaw.exe को फ़ाइल खोलने के रूप में दिखाया गया है, तो यह आपकी समस्या है।

+0

मैं अनलॉकर का उपयोग कर रहा हूं। और यह केवल "javaw.exe" को एकमात्र लॉकर के रूप में दिखाता है। :( – janetsmith

+0

मुझे लगता है कि एंटी-वायरस और इंडेक्सर्स जैसे स्कैनिंग अनुप्रयोगों को फ़ाइल को पकड़ने और इसे बदलने या बदलने से रोकने में सक्षम नहीं होना चाहिए ... क्या यह वास्तव में WinXP में है? – Yuval

+0

वे नहीं रखते हैं फाइल लंबे समय तक खुलती है, लेकिन आम तौर पर फ़ाइल में बदलाव के लिए देखते हैं और फाइल के अपडेट के बाद स्कैन करते हैं। अगर आप किसी फाइल को लिखते हैं, तो इसे बंद करें और फिर इसका नाम बदलने का प्रयास करें, फाइल * अभी भी उस बिंदु पर खुली हो सकती है (हालांकि नहीं लंबे समय तक) –

2

यदि कोई अपवाद नहीं फेंक दिया गया है (मुझे लगता है कि आपने यह देखा होगा) renameTo() केवल यह संकेत करने के लिए सही या गलत लौटाता है कि नाम सफल हुआ है या नहीं और कोई अतिरिक्त जानकारी नहीं देता है।

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

यह भी संभव है कि आपने एक अवैध पथ में पारित किया हो, या File कन्स्ट्रक्टर के लिए एक अस्तित्वहीन मार्ग दिया गया हो।

renameTo() केवल अपवाद फेंक होगा अगर वहाँ एक सुरक्षा उल्लंघन (SecurityException) है या फ़ाइल का नाम बदलने के लिए अगर आप एक null में गुजरती हैं।

+1

मुझे पता है कि यह झूठा रिटर्न देता है, लेकिन यह कोई संकेत नहीं देता कि यह क्यों विफल रहा। मैंने सभी outputStream.close() को बंद कर दिया है और इसे शून्य पर सेट किया है। लेकिन यह अभी भी यादृच्छिक रूप से विफल रहा है। मान लीजिए कि मैंने 10 फाइलें बनाई हैं, file0.tmp ... file9.tmp, यह file5.tmp फ़ाइल 5.txt में बदलने में विफल रहा हो सकता है। – janetsmith

1

मुझे एक समान समस्या थी, लेकिन यह यूनिक्स के साथ है।
नाम यादृच्छिक रूप से विफल रहा। मैंने प्रक्रिया को 3 से 4 बार फिर से शुरू किया और अंत में सफलता के लिए चला गया।
FYI फ़ाइल को उसी प्रक्रिया द्वारा बनाया गया था और उसी प्रक्रिया का नाम बदलता है ..

-4

फ़ाइल f = नई फ़ाइल (फ़ोल्डर + फ़ाइल); सत्यापित करें कि आपने सही पथ लिखा है .. f.exists(); अन्य मौजूद है और यदि देखा गया है तो procMon के साथ झूठी सत्यापित करें ..

2
File o=new File("d:/old.txt"); 
File n=new File("d:/new.txt"); 
n.delete(); 
o.renameTo(n); 

n.delete(): हम फ़ाइल (new.txt) को हटाने के लिए अगर मौजूद है की जरूरत है।

o.rename(n): इतना है कि फ़ाइल (old.txt) new.txt

+2

मैंने यह बहुत ही काम किया और अभी भी नाम से झूठी वापसी मिली। फ़ाइल बंद थी और कुछ भी नहीं था। विंडोज़। बस ... विंडोज़ – stu

3

तीन प्रमुख कारणों renameTo असफल हो सकता है के रूप में बदल दिया गया है (Android के लिए, लेकिन आप भी इस उपयोगी लग सकती)!

1) यदि आप फ़ोल्डरों को स्थान से स्थानांतरित करने के लिए स्थानांतरित कर रहे हैं, तो गंतव्य फ़ोल्डर एक फ़ाइल हो सकता है! गंतव्य बनाने के लिए गंतव्य Folder.mkdirs() बनाओ!

2) गंतव्य फ़ोल्डर पहले से मौजूद हो सकता है! गंतव्य को हटाएं ताकि आप पुराने फ़ाइल को उस नए स्थान पर स्थानांतरित करने के लिए नाम बदल सकें

3) बाहरी संग्रहण में आंतरिक संग्रहण को स्थानांतरित करने की अनुमति की आवश्यकता है, क्योंकि एसडी कार्ड को पढ़ने और लिखने की अनुमति की आवश्यकता है!

+0

मुझे यह सवाल Google के माध्यम से मिला, और # 2 मेरा मुद्दा था मदद के लिए धन्यवाद! –

+1

"गंतव्य बनाने के लिए गंतव्य Folder.mkdirs() बनाएं!" हू? – EntangledLoops

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

  • कोई संबंधित समस्या नहीं^_^