2012-03-01 64 views
6

假設我創建某些Windows符號鏈接,如:在Perl腳本中刪除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 

刪除包含在外殼的符號鏈接的目錄中我也有同樣的任務在Perl腳本做我們目前使用cygwin'rm -rf'。不幸的是,我們使用的是cygwin 1.5,而rm和rm -rf在該版本中不能在我想要使用的符號鏈接上正常工作(they delete symbolic link contents instead of the symlinks)。

如果我嘗試:

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

這工作得很好,我提供沒有任何目錄的符號鏈接(如一個在創造最上面的鏈接序列REM生成的),然後Perl的rmtree最終會像cygwin一樣行事,我最終刪除了原始目錄中的目錄內容。

有沒有人有我可以使用的備用perl遞歸目錄刪除方法的建議。我想到的只是一個外殼標註:

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

但這需要我測試平臺,並有不同的Windows和Unix的Perl代碼。

編輯: 請注意,與Unix不同,unlink()不能用於刪除目錄符號鏈接,至少在我們的構建系統當前使用的perl v5.6.0中是如此。但是,rmdir()確實可以刪除Windows目錄符號鏈接。

+0

如果您嘗試....什麼? – 2012-03-01 18:32:03

+0

對不起,在我還在問我的問題時,我稍微編輯了我的標題,並且過早地和無意地以不完整的狀態提交了問題。 – 2012-03-01 18:37:19

+0

感謝您的更新! – 2012-03-01 18:43:19

回答

0

您應該在perl腳本中使用unlink("FILE_FOO");調用。它是便攜式的。

+0

不能,不能解除鏈接,也不能使用rmdir與目錄符號鏈接正常工作。我應該在我對這個問題的描述中提到這一點。 – 2012-03-02 19:59:09

+0

更正。取消鏈接不適用於Windows上的目錄符號鏈接(與unix上的取消鏈接不同)。 rmdir()似乎是Windows目錄符號鏈接所必需的。 – 2012-03-02 20:42:01

2

您必須使用rmdir來刪除Windows中的目錄符號鏈接和聯結點,並且您必須使用簡單unlink刪除符號鏈接到文件。原因在於目錄符號鏈接和聯結點實際上是一個帶有附加文件系統元數據的空目錄(稱爲重解析點數據)。類似地,符號鏈接到文件是重分析點數據的空文件。當您閱讀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. 要查找的文件/文件夾是否是一個鏈接(各種):如果你調用GetFileAttributesGetFileInformationByHandleFindNextFile然後attributtes包含FILE_ATTRIBUTE_REPARSE_POINT標誌(例如:WIN32_FIND_DATA::dwFileAttributes)。如果它是一個目錄的鏈接,它還包含標誌FILE_ATTRIBUTE_DIRECTORY(請參閱1.)。

希望有所幫助。

+0

這與我發現的一致,但感謝您的信息。你是否知道在perl中查詢這些文件系統標記的方法,或者你是否需要編寫調用FindFirstFile(和朋友)的C代碼? – 2012-03-19 16:15:16

+0

是的,我確實有C++代碼,可以查詢/設置/刪除這些重分析標籤,這些標籤可以在Windows XP及以上版本中使用。該代碼太長並且很複雜,無法在此處發佈,因此需要編寫有關該代碼的完整文章。它主要基於我的實驗和閱讀MSDN。從Vista開始,您可以使用'CreateSymbolicLink'函數創建符號鏈接或'CreateHardLink'(XP及更高版本)來創建硬鏈接。我更新了我的答案 - 如何檢測鏈接/路口 - 請參閱上文。 – sirgeorge 2012-03-19 20:37:32