如何在不遵循联结点的情况下删除Windows目录?

时间:2010-01-04 23:46:55

标签: perl winapi junction

我有一个Perl脚本需要删除包含其所有内容的目录。 有时,此目录包含到另一个目录的联结点。如果我rmtree()天真地,rmtree()调用也将删除联结目标文件夹中的所有文件。我正在寻找一种不这样做的方法,而只是删除交汇点。

非Perl解决方案也将受到赞赏。

3 个答案:

答案 0 :(得分:6)

我只是在Google中键入了“联结点”并找到了我的方式 http://en.wikipedia.org/wiki/NTFS_junction_point

  

命令提示符(cmd.exe)

     
      
  • dir   Windows 2000或更高版本中的命令   识别连接点,显示    而不是在   目录列表(使用目录列表   / A或/ AL命令行开关)。
  •   
  • 任何   通常会影响的命令   普通目录中的文件会   在这里行事一样。这样命令   不应该使用del myjunction -   这将删除所有文件   目标目录。
  •   
  • 命令   rmdir和移动工作正常   交叉点,随着移动的警告   不会让交汇处移动到另一个   音量(与Windows相对)   资源管理器,如上所述。)
  •   
  • 的   rmdir命令是安全的,因为它只是   删除连接点,而不是   目标文件。走路的时候   带命令行的目录   接口,文件可以删除,但是   与资源管理器不同,目录也可以   被删除(使用rmdir / s dirname for   例子。)
  •   
  • 使用linkd命令   / d开关是一种安全的删除方式   交界点。
  •   

从我可以看到,您可以使用dir并grep <JUNCTION>的输出或使用Windows rmdir。我认为您可以通过system使用Perl中的任何一个。

答案 1 :(得分:4)

要找出重新分析点的位置(或“连接点”,如果你愿意):

dir /a:l /b > myjunctions.txt

将显示当前目录中的所有重新分析点。你可以添加/ s,但要注意重新分析点内的重新分析点也将被列出。

假设myjunctions.txt包含行x:\ subdir \ foo。要删除它,请发出

fsutil reparsepoint "x:\subdir\foo"

瞧!您的交接点消失了,原始目录也没有改变!

答案 2 :(得分:3)

FastCopy实用程序执行此操作:http://ipmsg.org/tools/fastcopy.html.en

我正在使用此程序复制或删除可能包含联结作为子文件夹的文件夹,以便联结目标保持不变。即使目标驱动器不同,也可以在复制时正确复制连接点。

Windows资源管理器至少在Windows 7旗舰版中也能正常工作,同时删除 - 交叉点目标保持不变。

但是在资源管理器中复制包含联结作为子文件夹的文件夹仍然无法正常工作 - 它实际上做了一些我还不能完全描述的事情:联结文件夹似乎被复制为普通文件夹,但它们的内容为空。