perl中的符号链接功能是否覆盖现有链接

时间:2017-08-25 00:24:17

标签: perl symlink

我试图模仿Unix命令

ln -sf /path/to/file /path/to/link

使用Perl

symlink (/path/to/file /path/to/link) 

Perl是否删除现有目标文件并创建类似于-s -f选项的符号链接?

2 个答案:

答案 0 :(得分:5)

symlink(2)只是使用相同的名称(EEXIST)调用操作系统调用,当" newpath已经存在"时返回错误-f。 / p>

如果您想实施unlink($new_qfn); symlink($old_qfn, $new_qfn) or die("Can't create symlink \"$new_qfn\": $!\n"); ,可以使用

if (!symlink($old_qfn, $new_qfn)) {
   if ($!{EEXIST}) {
      unlink($new_qfn)
         or die("Can't remove \"$new_qfn\": $!\n");
      symlink($old_qfn, $new_qfn)
         or die("Can't create symlink \"$new_qfn\": $!\n");
   } else {
      die("Can't create symlink \"$new_qfn\": $!\n");
   }
}

但是,以下方面可以更好地处理竞争条件:

ln

$ strace ln -sf a b ... symlink("a", "b") = -1 EEXIST (File exists) unlink("b") = 0 symlink("a", "b") = 0 ... 使用后一种方法。

string securityToken = "XXXXXXXXXXXXXXXX";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://webapi.teamviewer.com/api/v1/devices?groupid=g65527463");

request.Headers.Set("Authorization", "Bearer " + securityToken);
request.Method = "GET";
WebResponse response = request.GetResponse();

result = ((System.Net.HttpWebResponse)response).StatusCode.ToString();

if (result == "OK")
{
// YOUR CODE HERE...
};

答案 1 :(得分:2)

这很容易弄清楚自己。我们试试吧

.

ls -li link_to_FILE.txt
# 2415940160 lrwxrwxrwx.  ...  link_to_FILE.txt -> FILE.txt

打印

Cant make it: File exists at -e line 1.

我检查具有相同inode编号的原始文件(链接)是否仍然存在。

所以,不,它不会覆盖现有文件。

symlink的页面表示没有选项 f orce。