2009-08-13 12 views
26

मेरा छोटा उपयोगिता एप्लिकेशन उपयोगकर्ता को एक GUI फ़ाइल चयनकर्ता के माध्यम से आउटपुट निर्देशिका के लिए पूछता है। फिर कुछ प्रसंस्करण के बाद यह आउटपुट निर्देशिका में बहुत सी फाइलें बनाता है।इसके अंदर फ़ाइलों को बनाने से पहले किसी निर्देशिका में लेखन पहुंच की जांच

मैं अगर आवेदन लिखने इतना है कि यह उपयोगकर्ता को सूचित है और प्रसंस्करण के साथ जारी रखने के लिए नहीं करता है (एक लंबा समय लग सकता है) की जांच की आवश्यकता

मेरा पहला प्रयास था canWrite()java.io.File की विधि। लेकिन यह काम नहीं करता है क्योंकि यह निर्देशिका प्रविष्टि से संबंधित है और इसकी सामग्री नहीं है। मैंने कम से कम को Windows XP फ़ोल्डर का एक उदाहरण देखा है जिसका नाम बदला जा सकता है या हटाया जा सकता है लेकिन इसमें कोई भी फ़ाइल बनाई जा सकती है (अनुमतियों के कारण)। यह वास्तव में मेरा टेस्टकेस है।

मैं अंत में निम्नलिखित समाधान

//User places the input file in a directory and selects it from the GUI 
//All output files will be created in the directory that contains the input file 
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser 
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try 
{ 
    /* 
     * Create and delete a dummy file in order to check file permissions. Maybe 
     * there is a safer way for this check. 
     */ 
     sample.createNewFile(); 
     sample.delete(); 
} 
catch(IOException e) 
{ 
     //Error message shown to user. Operation is aborted 
} 

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

मुझे संदेह है कि इसके लिए एक बेहतर तरीका होना चाहिए, लेकिन सुरक्षा समाधान के साथ अब तक सभी समाधान पाए गए हैं और जावा एप्लेट्स के साथ सामान सौदा है और स्टैंडअलोन अनुप्रयोग नहीं हैं। क्या मुझे कुछ याद आ रही है?

वास्तव में फ़ाइलों को लिखने से पहले किसी निर्देशिका के अंदर फ़ाइल पहुंच की जांच करने का अनुशंसित तरीका क्या है?

मैं जावा 5. उपयोग कर रहा हूँ

+0

क्या होगा यदि "blank.txt" पहले से मौजूद है? फिर आप एक फ़ाइल को हटाना बंद कर देते हैं जो महत्वपूर्ण हो सकता है। –

+0

हां यह सबसे अच्छा होगा अगर बूलियन createNewFile() द्वारा लौटाया गया था, यह समझने के लिए उपयोग किया गया था कि फ़ाइल वास्तव में नहीं बनाई गई थी या नहीं। – kazanaki

उत्तर

19

आप फाइल अनुमति की जांच कर सकता है, यकीन है कि निर्देशिका मौजूद है, और यह जांच का एक बहुत करते हैं या कि वह सब के लिए जाँच करता है एक पुस्तकालय को खोजने की जरूरत है लगता है आप लेकिन (!) कोशिश करने के लिए जांच का सबसे अच्छा तरीका नहीं है? यदि आप अनुमतियों की जांच करते हैं और फाइल सिस्टम बदलते हैं ... आपको अपना कोड बदलना होगा। लेकिन एक फाइल लिखने की कोशिश हमेशा आपको बताएगी कि क्या आप एक फाइल लिख सकते हैं।

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

दूसरा समाधान प्रयास में आपके पूरे लेखन-टू-द-हार्ड-ड्राइव कोड को रखना होगा। और यदि आप लिख नहीं सकते हैं, तो पूरा हिस्सा छोड़ा जाएगा और आप पकड़ने वाले हिस्से में एक संदेश के साथ उपयोगकर्ता को प्रतिक्रिया देते हैं।

0

यह काम करता है, भले ही आप अंतिम पथ पर canWrite आह्वान नहीं करता है?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) { 
    doSomethingUseful(sample); 
} else { 
    notifyUser(); 
} 
+4

ऐसा इसलिए नहीं है क्योंकि फ़ाइल मौजूद होने पर CanWrite भी जांचता है। यह आपके कोड के साथ मामला नहीं है। इसका जवाडोक में उल्लेख किया गया है। – kazanaki

0

आप विवरण प्राप्त करने के लिए FilePermission का उपयोग कर सकते हैं। मैं एक तरह से जहां SecurityManager लागू करने के लिए कोड here और here

+0

मैंने फाइलप्रमिशन को देखा लेकिन मुझे ऐसा लगता है कि इसका उपयोग एप्लेट्स में फ़ाइलों तक पहुंच प्रदान करने के लिए किया जाता है। क्या आपके पास स्टैंडअलोन एप्लिकेशन के साथ एक उदाहरण है? – kazanaki

0

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

0

जावा 1.8 का उपयोग करके मैं निम्नलिखित का उपयोग करने में सक्षम था।

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); 
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); 
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); 
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); 

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); 
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); 
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); 

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); 
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); 
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE)); 
संबंधित मुद्दे

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