2012-03-01 15 views
6

मान लीजिए मैं, कुछ Windows सांकेतिक लिंक बनाने में के रूप में:एक पर्ल स्क्रिप्ट में विंडोज प्रतीकात्मक लिंक हटा दें?

rd /s /q source withlink linkdir 
mkdir source 
mkdir withlink 
echo blah > source/myfile 
cd withlink 
touch blah 
mklink mylink ..\source\myfile 
@REM mklink /d linkdir ..\source 
cd .. 

मैं

rd /s /q withlink 

साथ निर्देशिका खोल में सिमलिंक युक्त नष्ट कर सकते हैं मैं एक पर्ल स्क्रिप्ट में क्या करना ही काम है जहां हम वर्तमान में साइगविन 'आरएम-आरएफ' का उपयोग करते हैं। दुर्भाग्यवश हम साइगविन 1.5 और आरएम और आरएम-आरएफ का उपयोग कर रहे हैं जो प्रतीकात्मक लिंक (they delete symbolic link contents instead of the symlinks) पर उस संस्करण में ठीक से काम नहीं करते हैं।

अगर मैं कोशिश:

use File::Path qw(rmtree) ; 
rmtree(['withlink']) ; 

यह अच्छी तरह से काम करता है, बशर्ते मैं किसी भी निर्देशिका सांकेतिक लिंक (जैसे एक बना-लिंक के ऊपर अनुक्रम में बाहर REM'ed), तो पर्ल की जरूरत नहीं है rmtree सिगविन की तरह व्यवहार करना समाप्त होता है, और मैं अपनी मूल निर्देशिका की निर्देशिका सामग्री को हटा देता हूं।

क्या किसी के पास वैकल्पिक वैकल्पिक प्रतिलिपि निर्देशिका हटाने की विधि का सुझाव है जिसका मैं उपयोग कर सकता हूं। मैंने केवल एक खोल कॉलआउट के बारे में सोचा:

system("rd /s /q withlink") ; 

लेकिन इसके लिए मुझे प्लेटफॉर्म का परीक्षण करने और विंडोज और यूनिक्स के लिए अलग-अलग पर्ल कोड की आवश्यकता है।

संपादित करें: ध्यान दें कि यूनिक्स के विपरीत, अनलिंक() कम से कम perl v5.6.0 के साथ निर्देशिका सिम्लिंक को हटाने के लिए काम नहीं करता है, जो कि वर्तमान में हमारी बिल्ड सिस्टम का उपयोग कर रहा है। हालांकि, rmdir() एक विंडोज निर्देशिका symlink को हटाने के लिए काम करता है।

+0

यदि आप कोशिश करते हैं .... क्या? –

+0

क्षमा करें, मैंने अभी भी अपना शीर्षक थोड़ा सा संपादित किया था, जबकि मैं अभी भी अपना प्रश्न पूछ रहा था, और समय-समय पर और आकस्मिक रूप से अपूर्ण राज्य में सवाल जमा कर दिया। –

+0

अद्यतन के लिए धन्यवाद! –

उत्तर

0

आपको unlink("FILE_FOO"); कॉलल स्क्रिप्ट में कॉल करना चाहिए। यह पोर्टेबल है।

+0

नहीं, न तो अनलिंक करें और न ही rmdir निर्देशिका symlinks के साथ ठीक से काम करते हैं। मुझे इस मुद्दे के बारे में बताया जाना चाहिए था। –

+0

सुधार। अनलिंक विंडोज़ पर निर्देशिका सिम्लिंक के साथ काम नहीं करता है (यूनिक्स पर अनलिंक के विपरीत)। एक विंडोज निर्देशिका symlink के लिए rmdir() की आवश्यकता प्रतीत होती है। –

2

आपको विंडोज में निर्देशिका सिम्लिंक और जंक्शन बिंदुओं को हटाने के लिए rmdir का उपयोग करना होगा और फ़ाइलों को सिम्लिंक हटाने के लिए आपको बस unlink का उपयोग करना होगा। इसका कारण यह है कि एक निर्देशिका सिम्लिंक और जंक्शन बिंदु वास्तव में अतिरिक्त फ़ाइल सिस्टम मेटाडेटा (reparse बिंदु डेटा कहा जाता है) के साथ एक खाली निर्देशिका है। इसी तरह, फाइलों के लिए सिम्लिंक रीपर्स पॉइंट डेटा के साथ खाली फ़ाइलें हैं। जब आप Microsoft NTFS दस्तावेज़ पढ़ते हैं तो ऐसी निर्देशिका या फ़ाइल को रिपर्स पॉइंट कहा जाता है। रीपर पॉइंट प्रकार को रीपर्स पॉइंट TAG द्वारा निर्धारित किया जाता है। वहाँ "लिंक" के रूप में उपयोगकर्ताओं के लिए दो रीपार्स अंक 'टैग दिखाई दे रहे हैं:

  1. IO_REPARSE_TAG_SYMLINK - अगर एक निर्देशिका पर सेट - यह करने के लिए एक सिमलिंक है - यह एक निर्देशिका में एक प्रतीकात्मक कड़ी, अगर फाइल पर सेट किया गया है एक फ़ाइल
  2. IO_REPARSE_TAG_MOUNT_POINT - केवल एक निर्देशिका पर सेट किया जा सकता है - इसे "जंक्शन पॉइंट" कहा जाता है। यह किसी अन्य निर्देशिका में "लिंक" हो सकता है, लेकिन यह पूरे डिवाइस (वॉल्यूम) के लिए "माउंट प्वाइंट" हो सकता है।

संक्षेप में:

  1. आप निर्देशिका और जंक्शन अंक के लिए सिमलिंक हटाने रूप में यदि वे खाली निर्देशिका थे (वास्तव में अगर आप ऐसी बात की विशेषताओं की जांच यह दो है: FILE_ATTRIBUTE_DIRECTORY और FILE_ATTRIBUTE_REPARSE_POINT) ।
  2. आप फाइलों के लिए सिम्लिंक को हटाते हैं जैसे कि वे फाइलें थे।
  3. ऊपर वर्णित दोनों मामलों में - केवल लिंक/जंक्शन हटा दिया गया है (लक्ष्य नहीं)।
  4. बाहर फ़ाइल/फ़ोल्डर के लिए एक कड़ी (सभी प्रकार के) है कि क्या खोजने के लिए: यदि आप GetFileAttributes या GetFileInformationByHandle या FindNextFile तो फोन attributtes FILE_ATTRIBUTE_REPARSE_POINT ध्वज (उदा .: WIN32_FIND_DATA::dwFileAttributes) होते हैं। यदि यह किसी निर्देशिका के लिए एक लिंक है तो इसमें ध्वज FILE_ATTRIBUTE_DIRECTORY भी शामिल है (देखें 1.)।

आशा है कि मदद करता है।

+0

यह जो मैंने पाया, उसके अनुरूप है, लेकिन जानकारी के लिए धन्यवाद। क्या आप इन फाइल सिस्टम टैग को पर्ल के भीतर पूछने के तरीके के बारे में जानते हैं, या आपको सी कोड लिखना होगा जो FindFirstFile (और दोस्तों) को कॉल करता है? –

+0

हां, मेरे पास सी ++ कोड है जो Windows XP और ऊपर से काम करता है जो इन reparse टैग क्वेरी/सेट/हटा सकता है। कोड यहां पोस्ट करने के लिए बहुत लंबा और जटिल है, इसके बारे में पूरे लेख को लिखने की आवश्यकता होगी। यह ज्यादातर मेरे प्रयोगों और एमएसडीएन पढ़ने पर आधारित है। Vista से शुरू करने से आप 'CreateSymbolicLink' फ़ंक्शन का उपयोग सिल्लिंक बनाने के लिए सिमलिंक या' CreateHardLink' (XP और ऊपर) बनाने के लिए कर सकते हैं। मैंने अपना जवाब अपडेट किया - लिंक/जंक्शन का पता लगाने के लिए - कृपया ऊपर देखें। – sirgeorge

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