2012-02-06 13 views
9

क्या जावा के साथ एक प्लेटफॉर्म-स्वतंत्र तरीका है जिस पर फ़ाइल चलने वाले ड्राइव के प्रकार का पता लगाने के लिए है? असल में मुझे बीच में अंतर करने में दिलचस्पी है: हार्ड डिस्क, हटाने योग्य ड्राइव (यूएसबी स्टिक की तरह) और नेटवर्क शेयर। जेएनआई/जेएनए समाधान सहायक नहीं होंगे। जावा 7 माना जा सकता है।जावा: फ़ाइल के प्रकार को निर्धारित करने के तरीके को कैसे निर्धारित किया जाए?

+0

शायद यह हल करना आसान हो सकता है कि आप इसे क्यों जानना चाहते हैं? –

+2

मुझे अंतर्निहित फाइल सिस्टम के कुछ दोषों के बारे में उपयोगकर्ताओं को चेतावनी देने के लिए उस जानकारी की आवश्यकता है: प्रदर्शन, फ़ाइल सिस्टम निगरानी काम नहीं करेगी, ऐसी चीजें। – mstrap

+0

कृपया देखें http://stackoverflow.com/questions/3542018/how-can-i-get-list-of-all-drives-but-also-get-the-corresponding-drive-type-remo/17972420#17972420 मैं वांछित जानकारी तक पहुंचने के लिए डब्लूएमआई का उपयोग कर रहा हूं। –

उत्तर

3
स्विंग से

FileSystemView वर्ग कुछ ड्राइव (सीएफ isFloppyDrive, isComputerNode) के प्रकार का पता लगाने का समर्थन करने के कार्यक्षमता है। मुझे डर है कि यह पता लगाने का कोई मानक तरीका नहीं है कि यूएसबी के माध्यम से ड्राइव कनेक्ट है या नहीं।

काल्पनिक, अपरीक्षित उदाहरण:

import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileSystemView; 
.... 
JFileChooser fc = new JFileChooser(); 
FileSystemView fsv = fc.getFileSystemView(); 
if (fsv.isFloppyDrive(new File("A:"))) // is A: a floppy drive? 

JDK 7 में वहाँ एक और विकल्प है। मैंने इसका उपयोग नहीं किया है, लेकिन FileStore एपीआई में type विधि है। documentation कहता है कि:

इस विधि द्वारा लौटाई गई स्ट्रिंग का प्रारूप अत्यधिक कार्यान्वयन विशिष्ट है। यह इंगित कर सकता है, उदाहरण के लिए, प्रारूप का उपयोग किया गया है या यदि फ़ाइल स्टोर स्थानीय या दूरस्थ है।

जाहिर है जिस तरह से उपयोग करने के लिए यह इस होगा:

import java.nio.*; 
.... 
for (FileStore store: FileSystems.getDefault().getFileStores()) { 
    System.out.printf("%s: %s%n", store.name(), store.type()); 
} 
+4

FileSystemView.isFloppyDrive() कुछ "path.equals (" ए: \\ ")" द्वारा लागू किया गया है जो दुर्भाग्य से सहायक नहीं होगा। इसके अलावा, मुझे FileStore.type() सहायक नहीं मिला। यह मेरे नेटवर्क शेयरों के लिए "एनटीएफएस" देता है। – mstrap

+3

फ़ाइलस्टोर # प्रकार() विंडोज 7, जावा 7 पर नेटवर्क ड्राइव के लिए "एनटीएफएस" देता है। –

+0

फ़ाइलस्टोर # प्रकार() विंडोज 10 पर भी स्थानीय हार्ड ड्राइव के लिए "एनटीएफएस" देता है। – simpleuser

1

इस चर्चा पर एक नज़र डालें: How can I get list of all drives but also get the corresponding drive type (removable,local disk, or cd-rom,dvd-rom... etc)?

विशेष रूप http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/filechooser/FileSystemView.html

पर ध्यान देना मैं व्यक्तिगत रूप से इस इस्तेमाल नहीं किया है लेकिन यह प्रासंगिक लगता है। इसमें isFloppyDrive जैसी विधि है।

इसके अलावा JSmooth

+0

FileSystemView काम नहीं करेगा। जेएसमुथ काम कर सकता है, हालांकि मैं कुछ एपीआई ढूंढने की उम्मीद कर रहा था जो जेआरई के साथ ही जहाजों को भेजता है। – mstrap

4

पर एक नज़र आप के साथ जावा का उपयोग कर cmd पर अमल कर सकता है ले:

fsutil fsinfo drivetype {drive letter} 

परिणाम आप कुछ इस तरह दे देंगे:

C: - Fixed Drive 
D: - CD-ROM Drive 
E: - Removable Drive 
P: - Remote/Network Drive 
+3

यह मंच-स्वतंत्र नहीं है और fsutil को प्रशासनिक विशेषाधिकारों की भी आवश्यकता होती है। – mstrap

+1

मुझे यह कोड बहुत उपयोगी पाया गया: http://stackoverflow.com/questions/10678363/find-the-directory-for-a-filestore – MAbraham1

+0

मुझे भी (बहुत उपयोगी) – philwalk

0

यहाँ एक सार है जो दिखाता है कि net use का उपयोग करके इसे कैसे निर्धारित किया जाए: https://gist.github.com/digulla/31eed31c7ead29ffc7a30aaf87131def

कोड का सबसे महत्वपूर्ण हिस्सा:

public boolean isDangerous(File file) { 
     if (!IS_WINDOWS) { 
      return false; 
     } 

     // Make sure the file is absolute 
     file = file.getAbsoluteFile(); 
     String path = file.getPath(); 
//  System.out.println("Checking [" + path + "]"); 

     // UNC paths are dangerous 
     if (path.startsWith("//") 
      || path.startsWith("\\\\")) { 
      // We might want to check for \\localhost or \\127.0.0.1 which would be OK, too 
      return true; 
     } 

     String driveLetter = path.substring(0, 1); 
     String colon = path.substring(1, 2); 
     if (!":".equals(colon)) { 
      throw new IllegalArgumentException("Expected 'X:': " + path); 
     } 

     return isNetworkDrive(driveLetter); 
    } 

    /** Use the command <code>net</code> to determine what this drive is. 
    * <code>net use</code> will return an error for anything which isn't a share. 
    * 
    * <p>Another option would be <code>fsinfo</code> but my gut feeling is that 
    * <code>net</code> should be available and on the path on every installation 
    * of Windows. 
    */ 
    private boolean isNetworkDrive(String driveLetter) { 
     List<String> cmd = Arrays.asList("cmd", "/c", "net", "use", driveLetter + ":"); 

     try { 
      Process p = new ProcessBuilder(cmd) 
       .redirectErrorStream(true) 
       .start(); 

      p.getOutputStream().close(); 

      StringBuilder consoleOutput = new StringBuilder(); 

      String line; 
      try (BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()))) { 
       while ((line = in.readLine()) != null) { 
        consoleOutput.append(line).append("\r\n"); 
       } 
      } 

      int rc = p.waitFor(); 
//   System.out.println(consoleOutput); 
//   System.out.println("rc=" + rc); 
      return rc == 0; 
     } catch(Exception e) { 
      throw new IllegalStateException("Unable to run 'net use' on " + driveLetter, e); 
     } 
    } 
संबंधित मुद्दे