2012-03-01 25 views
6

varsayalım ben gibi bazı Windows sembolik bağlantıları oluşturmak:Windows sembolik linkleri perl betiğinde silinsin mi?

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 .. 

Ben

rd /s /q withlink 

ile kabuğunda sembolik içeren dizini silebilirsiniz ben perl programı yapmak aynı görevi var şu anda cygwin 'rm -rf' kullanıyoruz. Ne yazık ki biz cygwin 1.5 kullanıyoruz ve rm ve rm -rf kullanmak istiyorum (they delete symbolic link contents instead of the symlinks) sembolik linkler üzerinde bu sürümde düzgün çalışmıyor.

Ben denerseniz: Bu güzel çalışıyor

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

, sağlanan herhangi bir dizin sembolik bağlantıları (bir yukarıdaki oluşturmak-bağlantılar sırayla dışarı REM'ed gibi), sonra perl en yok rmtree cygwin gibi davranıyor, ve orijinal dizinimin dizin içeriği silinmiş.

herkes Kullanabileceğim alternatif perl ardışık dizin silme yönteminin bir öneri var mı. Ben sadece bir kabuk Ek bilgiyi düşündü:

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

ama bu platformun denenmesi ve Windows ve Unix için farklı perl kodu var gerektirir.

DÜZENLEME: DÜZENLEME: Unix'in tersine, unlink(), yapı sistemimizin şu anda kullandığı, en azından perl v5.6.0 ile bir dizin symlink'ini kaldırmak için çalışmaz. Ancak, rmdir() bir windows dizinini kaldırmak için çalışır.

+0

Eğer denerseniz .... ne? –

+0

Üzgünüm, hala soruyu sorduğumda başlığımı biraz düzenledim ve erken ve yanlışlıkla soruyu tamamlanmamış bir halde teslim ettim. –

+0

Güncelleme için teşekkürler! –

cevap

0

Sen perl unlink("FILE_FOO"); aramayı kullanmalısınız. Bu taşınabilir.

+0

Nope, ne klonlama ne de rmdir bir dizin symlinks ile düzgün çalışır. Sorunu açıkladığımda belirtmeliydim. –

+0

düzeltme. bağlantıyı kaldırma, windows'taki dizin bağlantılarıyla çalışmaz (unix'teki bağlantının aksine). rmdir() bir windows dizin symlink için gerekli gibi görünüyor. –

2

Windows'ta dizin symlink'lerini ve bağlantı noktalarını kaldırmak için rmdir kullanmanız gerekir ve dosyalara symlinks'i kaldırmak için sadece unlink kullanmanız gerekir. Bunun nedeni, bir dizin symlink ve birleşme noktasının gerçekten ek dosya sistemi meta verilerine sahip boş bir dizin olmasıdır (yeniden değerlendirme noktası verileri olarak adlandırılır). Benzer şekilde, dosyalara symlinks yeniden ayrılma noktası verileri ile boş dosyalarıdır. Microsoft NTFS belgelerini okuduğunuzda böyle bir dizin veya dosya yeniden ayrıştırma noktası olarak adlandırılır. Reparse point type, yeniden dönüşüm noktası TAG tarafından belirlenir. kullanıcılara görünür iki yeniden ayrıştırma noktaların etiketleri 'bağlantılar' gibi vardır:

  1. IO_REPARSE_TAG_SYMLINK - Bir dizinde ayarlarsanız - bu sembolik köprü ise - bir dizine sembolik bağ dosyası üzerinde ayarlarsanız, olduğunu bir dosya
  2. IO_REPARSE_TAG_MOUNT_POINT - sadece bir dizinde ayarlanabilir - buna "bağlantı noktası" denir. Başka bir dizine "bağlantı" olabilir, ancak tüm aygıt (birim) için "bağlama noktası" olabilir.

Özetlemek gerekirse:

  1. Sen dizinlere ve kavşak noktalarına sembolik kaldırmak onlar boş dizinleri sanki (aslında böyle bir şeyin özelliklerini kontrol eğer iki sahiptir: FILE_ATTRIBUTE_DIRECTORY ve FILE_ATTRIBUTE_REPARSE_POINT) .
  2. Symlinks dosyalarını dosyaymış gibi kaldırırsınız.
  3. Yukarıda belirtilen her iki durumda - sadece bağlantı/birleşim kaldırılır (hedef değil).
  4. dosya/klasör bir bağlantı (her türlü) olup olmadığını öğrenmek için: Sonra GetFileAttributes veya GetFileInformationByHandle veya FindNextFile ararsanız attributtes FILE_ATTRIBUTE_REPARSE_POINT bayrağı (örn .: WIN32_FIND_DATA::dwFileAttributes) içerirler. Bir dizinin bir bağlantısıysa, bayrak FILE_ATTRIBUTE_DIRECTORY'u da içerir (bkz. 1.).

Bu yardımcı olur umarım.

+0

Bu bulduğumla tutarlı, ancak bilgi için teşekkürler. Bu dosya sistemi etiketlerini perl içinde sorgulamanın bir yolunu biliyor musunuz, yoksa FindFirstFile (ve arkadaşları) çağıran C kodunu yazmanız mı gerekiyor? –

+0

Evet, Windows XP ve yukarısından çalışan bu yeniden etiketleme etiketlerini sorgulayabilen/ayarlayan/silebilen C++ kodum var. Kod burada yayınlamak için çok uzun ve karmaşıktır, bununla ilgili tüm yazıların yazılmasını gerektirir. Çoğunlukla deneylerime dayanarak ve MSDN okumaya dayanıyor. Vista'dan başlayarak, syslinks oluşturmak için 'CreateSymbolicLink' işlevini veya hardlink oluşturmak için' CreateHardLink' (XP ve üstü) kullanabilirsiniz. Cevabımı güncelledim - bağlantıları/bağlantıları nasıl belirleyecek - lütfen yukarıya bakın. – sirgeorge

İlgili konular