2012-05-10 10 views
7

पर एक प्रोग्राम है जिसे हमने एक निर्देशिका से दूसरी निर्देशिका में फ़ाइलों को स्थानांतरित करने का प्रयास करते समय मिटा दिया है। बहुत डीबगिंग के बाद मैंने एक छोटी उपयोगिता प्रोग्राम लिखकर त्रुटि दर्ज की जो सिर्फ एक निर्देशिका से दूसरी निर्देशिका में एक फ़ाइल ले जाती है (नीचे कोड)। यह पता चला है कि स्थानीय फाइल सिस्टम पर फ़ाइलों को स्थानांतरित करते समय ठीक काम करता है, फ़ाइल को किसी अन्य फाइल सिस्टम में स्थानांतरित करने का प्रयास विफल रहता है।जावा फ़ाइल को स्थानांतरित करने में विफल रहता है जब परिणामस्वरूप फ़ाइल किसी अन्य फाइल सिस्टम

यह क्यों है? सवाल मंच विशिष्ट हो सकता है - यदि यह मायने रखता है, तो हम ext3 पर लिनक्स चला रहे हैं।

और दूसरा प्रश्न; क्या मुझे कक्षा के renameTo() विधि से कुछ और उपयोग करना चाहिए? ऐसा लगता है जैसे यह स्थानीय फाइल सिस्टम पर काम करता है।

टेस्ट (रूट के रूप में चलाने):

touch /tmp/test/afile 

java FileMover /tmp/test/afile /root/ 
The file move was successful 

touch /tmp/test/afile 

java FileMover /tmp/test/afile /some_other_disk/ 
The file move was erroneous 

कोड:

import java.io.File; 

public class FileMover { 
    public static void main(String arguments[]) throws Exception { 
     boolean success; 
     File file = new File(arguments[0]); 
     File destinationDir = new File(arguments[1]); 
     File destinationFile = new File(destinationDir,file.getName()); 
     success = file.renameTo(destinationFile); 
     System.out.println("The file move was " + (success?"successful":"erroneous")); 
    } 
} 

उत्तर

16

File.renameTo की डॉक्स से:

[...] नाम बदलने की कार्रवाई नहीं हो सकता है फ़ाइल को एक फाइल सिस्टम से दूसरे पर स्थानांतरित करने में सक्षम हो [...]

स्पष्ट कामकाज फ़ाइल को "मैन्युअल रूप से" एक नई फ़ाइल खोलकर, फ़ाइल में सामग्री लिखकर, पुरानी फ़ाइल को हटाकर कॉपी करना होगा।

आप अपाचे कॉमन्स से FileUtils.moveFile विधि भी आजमा सकते हैं।

+0

है Errr ... फ्लॉप आपका जवाब है, जबकि लोड है मैंने मेरा बना लिया :), moveFile उद्धारकर्ता +1 है – mprabhat

+0

अपाचे कॉमन्स पर आपका सुझाव बिल्कुल मेरा अगला कदम था। एक सूचनात्मक उत्तर के लिए धन्यवाद जो वास्तव में दोनों सवालों का जवाब देता है! – oligofren

+1

ऊपर दिए गए उत्कृष्ट उत्तर में जोड़ने के लिए, सिस्टम कॉल को रीडेनिंग में उपयोग किया जाता है EXDEV यदि पुरानापाथ और न्यूपाथ उसी आरोहित फ़ाइल सिस्टम पर नहीं है। असल में प्रोग्राम "एमवी" इस स्थिति को एक स्पष्ट प्रतिलिपि करके ऑपरेशन हटाकर संभालता है। – ghostkadost

6

बचाव के लिए Javadoc:

इस विधि के व्यवहार से कई पहलू हैं स्वाभाविक मंच पर निर्भर: नाम बदलने की कार्रवाई, एक फाइल सिस्टम से दूसरे में एक फ़ाइल स्थानांतरित करने में सक्षम नहीं हो सकता है यह हो सकता है परमाणु नहीं होना चाहिए, और यह सफल नहीं हो सकता है यदि गंतव्य सार पथनाम वाली फ़ाइल पहले से मौजूद है। सुनिश्चित करने के लिए रिटर्न मान हमेशा जांचना चाहिए कि नाम बदलें ऑपरेशन सफल था।

ध्यान दें कि फ़ाइलें वर्ग फ़ाइल को स्वतंत्र रूप से प्लेटफ़ॉर्म में स्थानांतरित या नाम बदलने के लिए चाल विधि को परिभाषित करता है।

1

डॉक्स से:

इस सार पथ नाम से दर्शाया जाता है फ़ाइल नाम बदलता है।

इस विधि के व्यवहार के कई पहलुओं स्वाभाविक मंच पर निर्भर कर रहे हैं: नाम बदलने की कार्रवाई एक फाइल सिस्टम से दूसरे में एक फ़ाइल को स्थानांतरित करने में सक्षम नहीं हो सकता है, यह परमाणु नहीं हो सकता है, और यह अगर सफल नहीं हो सकता है गंतव्य सार पथनाम के साथ एक फ़ाइल पहले से मौजूद है। सुनिश्चित करने के लिए रिटर्न मान हमेशा जांचना चाहिए कि नाम बदलें ऑपरेशन सफल था।

आप अलग अलग फाइल सिस्टम आप अपाचे के moveFile

-1

अपने Ider उपयोग कर सकते हैं के बीच फ़ाइल ले जाना चाहते हैं त्रुटि beause/some_other_disk/रिश्तेदार यूआरएल लेकिन पूरी तरह से यूआरएल है, यूआरएल नहीं मिल सकता है मैं उदाहरण है

जावा FileMover डी: \ Eclipse33_workspace_j2ee \ परीक्षण \ src \ एक \ a.txt डी: \ Eclipse33_workspace_j2ee \ परीक्षण \ src फ़ाइल कदम था सफल

जावा FileMover डी: \ Eclipse33_workspace_j2ee \ परीक्षण \ src \ एक \ a.txt \ Eclipse33_workspace_j2ee \ परीक्षण \ src

फ़ाइल चाल erronous था

परिणाम यूआरएल त्रुटि

+0

'/' से शुरू होने वाला कोई भी पथ एक पूर्ण पथ (यूनिट पर) है। तो नहीं। वास्तव में प्रश्न का उत्तर देने वाले किसी चीज़ के लिए उत्तर देखें। – oligofren

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