PHP Conference Japan 2024
添加注释

用户贡献的注释 8 条注释

mbirth at webwriters dot de
16 年前
要确定文件是否硬链接到另一个文件名,请检查 stat() 输出的链接数。如果它 >1,则该文件还有另一个文件名。

要确定两个文件名是否指向同一个文件,请检查这两个文件名的 inode 号。如果相等,则这两个文件名是硬链接在一起的。
PaulE
15 年前
Windows LNK 文件的解决方法

<?php

function _is_link($filename)
{
if(
is_link($filename))
return
true;

$ext = substr(strrchr($filename, '.'), 1);
if(
strtolower($ext) == 'lnk')
{
return (
_readlink($filename) ? true : false);
}

return
false;
}

function
_readlink($file)
{
if(
file_exists($file))
{
if(
is_link($file))
{
return
readlink($file);
}

// Get file content
$handle = fopen($file, "rb");
$buffer = array();

while(!
feof($handle))
{
$buffer[] = fread($handle, 1);
}

fclose($handle);

// Test magic value and GUID
if(count($buffer) < 20)
return
false;
if(
$buffer[0] != 'L')
return
false;
if((
ord($buffer[4]) != 0x01) ||
(
ord($buffer[5]) != 0x14) ||
(
ord($buffer[6]) != 0x02) ||
(
ord($buffer[7]) != 0x00) ||
(
ord($buffer[8]) != 0x00) ||
(
ord($buffer[9]) != 0x00) ||
(
ord($buffer[10]) != 0x00) ||
(
ord($buffer[11]) != 0x00) ||
(
ord($buffer[12]) != 0xC0) ||
(
ord($buffer[13]) != 0x00) ||
(
ord($buffer[14]) != 0x00) ||
(
ord($buffer[15]) != 0x00) ||
(
ord($buffer[16]) != 0x00) ||
(
ord($buffer[17]) != 0x00) ||
(
ord($buffer[18]) != 0x00) ||
(
ord($buffer[19]) != 0x46))
{
return
false;
}

$i = 20;
if(
count($buffer) < ($i + 4))
return
false;

$flags = ord($buffer[$i]);
$flags = $flags | (ord($buffer[++$i]) << 8);
$flags = $flags | (ord($buffer[++$i]) << 16);
$flags = $flags | (ord($buffer[++$i]) << 24);

$hasShellItemIdList = ($flags & 0x00000001) ? true : false;
$pointsToFileOrDir = ($flags & 0x00000002) ? true : false;

if(!
$pointsToFileOrDir)
return
false;

if(
$hasShellItemIdList)
{
$i = 76;
if(
count($buffer) < ($i + 2))
return
false;

$a = ord($buffer[$i]);
$a = $a | (ord($buffer[++$i]) << 8);

}

$i = 78 + 4 + $a;
if(
count($buffer) < ($i + 4))
return
false;

$b = ord($buffer[$i]);
$b = $b | (ord($buffer[++$i]) << 8);
$b = $b | (ord($buffer[++$i]) << 16);
$b = $b | (ord($buffer[++$i]) << 24);

$i = 78 + $a + $b;
if(
count($buffer) < ($i + 4))
return
false;

$c = ord($buffer[$i]);
$c = $c | (ord($buffer[++$i]) << 8);
$c = $c | (ord($buffer[++$i]) << 16);
$c = $c | (ord($buffer[++$i]) << 24);

$i = 78 + $a + $b + $c;
if(
count($buffer) < ($i +1))
return
false;

$linkedTarget = "";
for(;
$i < count($buffer); ++$i)
{
if(!
ord($buffer[$i]))
break;

$linkedTarget .= $buffer[$i];
}

if(empty(
$linkedTarget))
return
false;


return
$linkedTarget;
}

return
false;
}

if(
_is_link('test.lnk'))
{
echo
_readlink('test.lnk');
}
?>
msaladna at apisnetworks dot com
7 年前
在使用线程安全构建时,使用 is_link() 时要小心使用自引用目录项“.”。在 ZTS 构建中,is_link("/home/symlink/.") 将返回 true,而在非 ZTS 构建中则返回 false。
gggeek
11 年前
在 Windows 上,请注意 is_link 对 Junction 返回 false。
区分目录和连接的方法包括执行 stat() 和 lstat() 调用并检查结果是否存在差异
neverpanic->gmail[com]
17 年前
对我来说(Debian Sarge VPS),即使对于目录,is_link 也会返回 true,如果你没有在文件名后添加尾部斜杠。
<?php
if ($dir{strlen($dir)-1} == '/') $dir = substr($dir, 0, -1);
is_link($dir);
?>
这对我有用。但是它无法检测完整路径中的某个符号链接(即 is_link(/www/somedir/file.php) 将返回 false,就像 is_link(/www/) 一样)
foobarfarter
16 年前
@radon8472 at hotmail dot com
Windows 的 .lnk 东西是真实文件,资源管理器只将它们视为链接。尝试使用 Win+R->"notepad X:\Path\Visiblefilename.lnk 打开一个,您将看到很多 0 字节,但链接路径会直接显示在屏幕上。php 应该能够做同样的事情。
andudi at gmx dot ch
22 年前
在我的 SuSE 7.2 上,is_link 不适用于目录,但为了找出目录是否为链接,我现在使用以下方法

$linkdir = $path.$linkdirname;
if (realpath($linkdir) != realpath($path)."/".$linkdirname)
//$linkdir 是一个符号链接的目录!
...

这工作得很好 :-)

Andreas Dick
brendy at gmail dot com
18 年前
在 Mac OSX 上,要查看文件是否为 Finder 别名



<?PHP
if( getFinderAlias( $someFile , $target ) ) {
echo
$target;
}
else {
echo
"文件不是别名";
}

function
getFinderAlias( $filename , &$target ) {
$getAliasTarget = <<< HEREDOC
-- APPLESCRIPT 开始 --
set checkFileStr to "
{$filename}"
set checkFile to checkFileStr as POSIX file
try
tell application "Finder"
if original item of file checkFile exists then
set targetFile to (original item of file checkFile) as alias
set posTargetFile to POSIX path of targetFile as text
get posTargetFile
end if
end tell
end try
-- APPLESCRIPT 结束 --
HEREDOC;
$runText = "osascript << EOS\n{$getAliasTarget}\nEOS\n";
$target = trim( shell_exec( $runText ) );
return (
$target == "" ? false : true );
}
?>
To Top