2012-09-20 38 views
6

मैं विंडोज 64 बिट पर ओरेकल जावा 7 का उपयोग कर रहा हूं।"फ़ाइल सिम्लिंक" के बजाय विंडोज़ पर "निर्देशिका सिम्लिंक" बनाने के लिए जावा 7 को कैसे मजबूर करें?

जब मैं एक सिमलिंक Files.createSymbolicLink का उपयोग कर बनाने के लिए, मैं इस व्यवहार को नोटिस:

  1. लक्ष्य एक निर्देशिका, एक "निर्देशिका सिमलिंक" बनाई गई है है।
  2. यदि लक्ष्य एक फ़ाइल है, तो "फ़ाइल सिम्लिंक" बनाया गया है।
  3. यदि लक्ष्य मौजूद नहीं है, तो "फ़ाइल सिम्लिंक" बनाया गया है।

The type of the symlink is fixed and never changes, इसके लक्ष्य में किए गए किसी भी बदलाव के बावजूद।

विंडोज के मूल mklink कमांड का उपयोग करके, लिंक प्रकार को "निर्देशिका सिम्लिंक" के रूप में बल देना संभव है। क्या मूल जावा एपीआई या कुछ लाइब्रेरी का उपयोग करके इसे हासिल करना संभव है?

एक तुच्छ और बदसूरत तरीका है: लक्ष्य एक निर्देशिका है

  1. हैं, तो बस, लिंक
  2. यदि लक्ष्य मौजूद नहीं है बनाने के लिए एक नया खाली लक्ष्य निर्देशिका बनाने, लिंक बनाने, और निर्देशिका हटा दें।
  3. यदि लक्ष्य एक फ़ाइल है ... इसे संभाल लें (इसे ले जाएं, # 2 लागू करें, इसे वापस ले जाएं)।

भाग्यशाली।

उत्तर

2

दुर्भाग्यवश मुझे जावा एपीआई के भीतर ऐसा करने का कोई तरीका नहीं दिख रहा है।

मैं Windows JRE कोड की जाँच की और यह खुद को जिम्मेदार बताते हैं निर्णय की तरह फ़ाइल पर आधारित है दिखता है:

try 
{ 
    WindowsFileAttributes windowsfileattributes = WindowsFileAttributes.get(windowspath2, false); 
    if(windowsfileattributes.isDirectory() || windowsfileattributes.isDirectoryLink()) 
     i |= 1; 
} 

विशेषताओं खुद को देशी कोड से उत्पन्न, और ऐसा लगता है कि करने के लिए कोई रास्ता नहीं है की तरह उन्हें प्रभावित करें।

स्पष्ट रूप से आपके पास अन्य विकल्प हैं जैसे मैन्युअल रूप से mklink का आविष्कार करना या PowerMock (जो स्पष्ट रूप से इस उद्देश्य के लिए नहीं है) का उपयोग करके लौटाए गए ऑब्जेक्ट्स में हेरफेर करना।

एक और गंदे विकल्प सभी प्रासंगिक वर्गों के प्रॉक्सी बनाने के लिए है: Path, FileSystem और FileSystemProvider
जिस तरह से यह काम करता है वह यह है कि PathFileSystem देता है जो FileSystemProvider देता है - आपको क्या करना है यह संशोधित करता है कि FileSystemProvider.createSymbolicLink विधियां कैसे व्यवहार करती हैं।

createSymbolicLink विधि एक varargs तर्क जो वर्तमान में नहीं किया जाता है प्राप्त करता है - आप इसे करने के लिए एक तर्क है कि अपने आवरण से संकेत मिलता है कि यह जिस तरह से सांकेतिक लिंक बनाई गई हैं ओवरराइड करने के लिए की जरूरत है पारित कर सकते हैं - और वहाँ तुम जाओ :)

यह सब लिखने के बाद - मेरा एकमात्र प्रश्न है - आपको इस तरह के व्यवहार की आवश्यकता क्यों है?

+0

असल में कोई बड़ी ज़रूरत नहीं है, मैंने अपने व्यवहार में एक बग के माध्यम से इस व्यवहार की खोज की जिसने सिम्लिंक के लक्ष्य को नहीं बनाया। – ripper234

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

  • कोई संबंधित समस्या नहीं^_^