2010-02-01 19 views
12

हम यहां जावा 1.6 के बारे में बात करते हैं। चूंकि symoblic लिंक अभी तक समर्थित नहीं है, इसलिए उनके अस्तित्व की जांच कैसे कर सकते हैं।जावा: प्रतीकात्मक लिंक फ़ाइल अस्तित्व की जांच करें

1: बताओ wheather लिंक फ़ाइल स्वयं मौजूद है (सच वापसी भले ही लिंक टूट गया है)

2: कड़ी का अनुसरण करें और बता wheather अंतर्निहित फ़ाइल मौजूद है।

क्या जेएनआई को छोड़कर इसका एहसास करने का कोई तरीका नहीं है?

+0

अपाचे फ़ाइल उपयोग से कॉपी किया गया एक बेहतर समाधान यहां पाया जा सकता है: http://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-links – Gray

उत्तर

6

अब के लिए उस तरह से लग रहा है ... जब तक आप openjdk के साथ जाने के http://openjdk.java.net/projects/nio/javadoc/java/nio/file/attribute/BasicFileAttributes.html#isSymbolicLink()

+3

बस अगर कोई आश्चर्यचकित हो, तो स्थिर विधि उपयोग कर सकते हैं 'java.nio.file.Files.isSymbolicLink (पथ पथ) '। – konsolebox

1

निम्नलिखित आप एक शुरुआत देना चाहिए:

if (file.exists() && !file.isDirectory() && !file.isFile()) { 
    // it is a symbolic link (or a named pipe/socket, or maybe some other things) 
} 

if (file.exists()) { 
    try { 
     file.getCanonicalFile(); 
    } catch (FileNotFoundException ex) { 
     // it is a broken symbolic link 
    } 
} 

संपादित: डॉन ऊपर जैसा कि मैंने सोचा था कि फ़ाइल नहीं है क्योंकि file.isDirectory() और file.isFile() एक प्रतीकात्मक लिंक को हल करता है। (हम रहते हैं और सीखते हैं!)

यदि आप एक सटीक दृढ़ संकल्प चाहते हैं, तो आपको प्रासंगिक देशी ओएस-विशिष्ट लाइब्रेरी कॉल करने के लिए जेएनआई का उपयोग करने की आवश्यकता होगी।

+0

धन्यवाद, लेकिन file.exists() मुझे लगता है कि प्रतीकात्मक लिंक के लिए झूठी वापसी होगी। – solotim

+1

यह लिनक्स पर नहीं है। लेकिन दुर्भाग्यवश, file.isFile() और file.isDirectory() एक प्रतीकात्मक लिंक को हल करें और हल ऑब्जेक्ट के प्रकार के आधार पर परिणाम लौटाएं। –

+0

यह लिनक्स पर झूठी वापसी करता है। आप http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4956115 के मूल्यांकन भाग को भी देख सकते हैं। – solotim

1

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

+1

जावा 1.7 प्रतीकात्मक-लिंक इंटरफ़ेस को लागू करने जा रहा है, तो मंच के लिए उनका क्या विचार स्वतंत्र है? – solotim

+0

हम्म .. दिलचस्प है..तुम इसे देख सकते हो: http: // stackoverflow।कॉम/प्रश्न/813710/जावा -1-6-निर्धारित-प्रतीकात्मक-लिंक – Aadith

5

यह धीमा है लेकिन आप getAbsolutePath() और फ़ाइल के CanonicalPath() की तुलना कर सकते हैं। तो केवल एक प्रदर्शन महत्वपूर्ण कोड पथ के बाहर उपयोग करें।

+1

यह विंडोज लिंक के लिए काम नहीं करता है, केवल * निक्स प्रतीकात्मक लिंक। – searchengine27

0

# 2 आसान है: बस File.isFile आदि का उपयोग करें, जो लिंक को पार करेगा। कठिन हिस्सा # 1 है।

तो तुम java.nio.file का उपयोग करता है, तो नहीं कर सकते, और JNI आदि, केवल एक चीज मैंने पाया जो काम करता है से बचना चाहते हैं:

static boolean exists(File link) { 
    File[] kids = link.getParentFile().listFiles(); 
    return kids != null && Arrays.asList(kids).contains(link); 
} 

बहुत कुशल लेकिन स्पष्ट नहीं है।

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