2012-05-28 12 views
5

मैं निम्नलिखित स्निपेट है:जावा में फाइल अनुमति की जांच कैसे करें (ओएस स्वतंत्र रूप से)

public class ExampleClass { 

public static void main(String[] args) throws FileNotFoundException { 
    String filePath = args[0]; 
    File file = new File(filePath); 

    if (!file.exists()) 
     throw new FileNotFoundException(); 

    if (file.canWrite()) 
     System.out.println(file.getAbsolutePath() + ": CAN WRITE!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT WRITE!!!!!"); 

    if (file.canRead()) 
     System.out.println(file.getAbsolutePath() + ": CAN READ!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT READ!!!!!"); 

    if (file.canExecute()) 
     System.out.println(file.getAbsolutePath() + ": CAN EXECUTE!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT EXECUTE!!!!!"); 
} 
} 

यह लिनक्स ओएस में काम करता है, लेकिन समस्या यह है कि यह windows7 में काम नहीं करता है। तो सवाल यह है: क्या किसी को जावा ओएस में फ़ाइल में विशेषाधिकारों की जांच करने के लिए कोई तरीका पता है?

+6

यह विंडोज 7 पर "काम नहीं करता" कैसे है? –

+1

क्या * ठीक * काम नहीं करता है? –

+0

बताएं कि आप उपरोक्त कोड को चलाने पर फ़ाइल अनुमतियों के लिए कौन सा आउटपुट प्राप्त करते हैं। इसके बिना कुछ भी कर सकते हैं। – MozenRath

उत्तर

5

यह किसी असंगत तरीके से फ़ाइल पहुंच में "मध्यस्थता" एंटी-वायरस उत्पाद) "मध्यस्थता" के कारण हो सकता है।

निश्चित रूप से, यह विश्वास है कि जावा File.canXxxx() तरीके हैं आम तौर पर Windows के किसी भी स्वाद पर टूट कठिन है।


अद्यतन - मुझे लगता है कि वापस ले। this Sun bug report पढ़ें ... और रोओ। संक्षिप्त जवाब यह है कि यह एक विंडोज बग है, और सूर्य ने इसके आसपास काम नहीं करने का फैसला किया। (लेकिन नया जावा 7 एपीआई काम करें ...)

एफडब्ल्यूआईडब्ल्यू, मैं यह मानता हूं कि यह फ़ाइल एक्सेस अनुमतियों को जांचने का प्रयास करने के लिए खराब अभ्यास है। फ़ाइल का उपयोग करने का प्रयास करना बेहतर होता है, और अगर वे होते हैं तो अपवादों को पकड़ना बेहतर होता है। मेरे तर्क के लिए https://stackoverflow.com/a/6093037/139985 देखें। (और अब हमारे पास एक और कारण है ...)

+0

से इनकार करता हूं लेकिन वे फ़ाइल.canExecute() निष्पादित करते समय सत्य लौटते हैं cmd रिटर्न में फ़ाइल (.bat) "एक्सेस अस्वीकृत" –

+0

ठीक है, धन्यवाद, यह उपयोगी था –

+0

मैंने लिंक में कोड का परीक्षण किया है, और मैंने पाया कि jdk 1.7.0_79 में यह बग अब और नहीं है। जब मैं फ़ाइल को सेट नहीं कर सकता और लिख सकता हूं कि विंडोज 10 एक्सप्लोरर में छिपा हुआ है, तो कोड दिखाता है कि इसे लिखा नहीं जा सकता है और उम्मीद के अनुसार छिपा हुआ है। तो मुझे लगता है कि यह जावा 7 में तय है। – FaithReaper

0

मैंने एनआईओ एपीआई (जावा 7 से) पर कुछ परीक्षण किए हैं और वे पूरी तरह से काम करने लगते हैं।

import java.io.FileNotFoundException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class PermissionCheck { 

    public static void main(String[] args) throws FileNotFoundException { 

     String filePath = args[0]; 
     Path p = Paths.get(filePath); 

     if (Files.notExists(p)) 
      throw new FileNotFoundException(); 

     if (Files.isWritable(p)) 
      ... 

     if (Files.isReadable(p)) 
      ... 

     if (Files.isExecutable(p)) 
      ... 
    } 
} 

JDKs: 1.7.0_25, 1.8.0_91

ओएस: विंडोज 7, 8 (64 बिट)

2

सबसे पहले, जावा विश्वास स्थानीय फ़ाइलों और untrust दूरस्थ फ़ाइलें डिफ़ॉल्ट रूप से और डिजाइन द्वारा । तो परीक्षण करते समय, इस बात से अवगत रहें कि आप घर पर अपने कंप्यूटर में क्या कर सकते हैं, आपकी कंपनी के सर्वर के कुछ रिमोट ड्राइव में असंभव हो सकता है।

दूसरा, जब हम दूरस्थ ड्राइव पर फाइल अनुमति की जाँच करें, यह आम तौर पर नहीं पर्याप्त बस Windows Explorer में स्थापित है (संपत्ति ... - पढ़ें केवल/छिपाएं/आर्काइव, आदि) । उदाहरण के लिए, मेरे संगठन में स्थानीय और दूरस्थ दोनों फ़ाइल अनुमतियों को नियंत्रित करने के लिए अन्य मेचिनिज़्म हैं, और यहां तक ​​कि मेरे पीसी के प्रशासक भी सबकुछ गारंटी नहीं दे सकते हैं। भले ही मैन्युअल रूप से/प्रोग्रामेटिक रूप से आप किसी फ़ाइल की अनुमति बदल सकते हैं, अगर कुछ अन्य एप्लिकेशन/समूह नीति/आदि आपको ऐसा करने से मना कर देती हैं, तो परिवर्तन विफल हो सकता है। (उदाहरण के लिए, setReadable()false देता है, यह सुझाव देता है कि यह संभव नहीं है) उदाहरण के लिए, मैं दूरस्थ निर्देशिका में executetxt फ़ाइल को खोल सकता हूं, जिसका अर्थ है, लेकिन उसी निर्देशिका में bat फ़ाइल निष्पादन योग्य नहीं है, असल में, मेरे मामले में, जब मैं bat फ़ाइल बनाना चाहता हूं तो मुझे अपने व्यवस्थापक से अधिक अधिकार प्राप्त करने के लिए कहा जाना चाहिए। मुझे लगता है कि यह हो सकता है कि bat एक्सटेंशन वर्जित है। चूंकि विंडोज़ में कुछ उपयोगकर्ता समूह में उपयोगकर्ता के रूप में, आपके द्वारा चलाए जाने वाले आपके एक्शन और जेवीएम जेवीएम की तुलना में उच्च नियमों द्वारा सीमित हैं। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।

हालांकि, अगर आप किसी फ़ाइल की अनुमति सेट नहीं कर पाएंगे, तो अब आप उन्हें जावा 7 में सही ढंग से पढ़ सकते हैं। स्पष्ट रूप से बग रिपोर्ट के बाद, जावा लोगों ने इसे सबसे अधिक ठीक करने के लिए कुछ किया था।मैं jdk 1.7.0_19 उपयोग कर रहा हूँ, और परीक्षण करने के लिए, मैं निम्नलिखित किया है:

  1. Read Only और Hidden करने के लिए, एक दूरस्थ फ़ाइल की संपत्ति सेट Windows Explorer में।

  2. जावा से इसे नीचे कोड के साथ पढ़ें (स्टीफन सी के लिंक से और setXxxxx() विधियों को देखने के लिए संशोधित किया जा सकता है)।

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    
    public class FilePermissionTester { 
        public static void main(String[] args) throws IOException { 
         File file = new File("Y:\\some\\remote\\drive\\directoy\\xxxxx.txt"); 
         System.out.println("exists:" + file.exists()); 
         System.out.println("is file:" + file.isFile()); 
         System.out.println("can read:" + file.canRead()); 
         System.out.println("can execute:" + file.canExecute()); 
         System.out.println("can write:" + file.canWrite()); 
         System.out.println("is hidden:" + file.isHidden()); 
    
         System.out.println("change it to be unreadable, and it works? " + file.setReadable(false)); 
         System.out.println("can read:" + file.canRead()); 
         System.out.println("change it to be writable, and it works? " + file.setWritable(true)); 
         System.out.println("can write:" + file.canWrite()); 
         FileInputStream fileInputStream = new FileInputStream(file); 
         fileInputStream.read(); 
         fileInputStream.close(); 
    
    
        } 
    
    } 
    

मुझे मिल गया:

exists:true 
is file:true 
can read:true 
can execute:true 
can write:false 
is hidden:true 
change it to be unreadable, and it works? false 
can read:true 
change it to be writable, and it works? true 
can write:true 

और अब मैं इस फ़ाइल को पढ़ सकता है, इसे संपादित और उसे सहेजें। अनुमति बदलने से पहले मुझे से बचाने के लिए कहा गया था .. सहेजते समय।

ध्यान दें कि फ़ाइल पठनीय है, और setReadable(false)false देता है, और फ़ाइल अभी भी पठनीय है। जावाडोक कहते हैं here कि setReadable() वापसी false जब उपयोगकर्ता को एक्सेस प्रीमिशन बदलने की अनुमति नहीं है, या readable पहले से ही false है, और अंतर्निहित सिस्टम के लिए कार्यान्वयन नहीं है। जावा एपीआई में डिबगिंग ज्यादा जानकारी प्रदान नहीं करता है, क्योंकि कार्यान्वयन native चिह्नित है और अधिक नहीं देख सकता है। लेकिन मुझे जवाबदेही बदलने की अनुमति है, इसलिए ऐसा कुछ है जिसे मैं समझ नहीं पा रहा हूं।

लेकिन यह भी ध्यान रखें वहाँ अधिक विशेषताओं की तरह java.util.File द्वारा समर्थित नहीं हैं, देखते हैं कि। शायद आप java.security में अन्य pacakges की जांच कर सकते हैं, जैसे AccessController?

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