Edit report at https://bugs.php.net/bug.php?id=65697&edit=1

 ID:                 65697
 User updated by:    giunta dot gaetano at gmail dot com
 Reported by:        giunta dot gaetano at gmail dot com
 Summary:            is_link not working with windows junctions
 Status:             Not a bug
 Type:               Bug
 Package:            *Directory/Filesystem functions
 Operating System:   win7 64bit
 PHP Version:        5.4.19
 Block user comment: N
 Private report:     N

 New Comment:

Mmm, if it walks like a duck and quacks like a duck...

For all scenarios I can figure (backups, deploying code using symlinks), 
treating a junction as a symlink makes more sense than not doing it.

Right now the only way to tell if a folder is actually a "real one" or not is 
to use the array_diff trick I put in the test script. It looks hackish, 
cumbersome, and why should lstat() treat a junction differently than is_link()  
anyway?)

It is true that windows versions starting with Vista do create symlinks by 
default, but tools like "Link Shell Extension" or the venerable sysinternals 
junction.exe still allow one to create Junctions.


Previous Comments:
------------------------------------------------------------------------
[2013-09-18 19:00:39] paj...@php.net

Junctions are not symlinks, the result is correct. Also the 
junctions pointing to a directory may work. I remember 
some windows version specific changes here, where it 
ended as symlink or junction (recent always do it as 
symlonk afair)

------------------------------------------------------------------------
[2013-09-18 12:51:32] giunta dot gaetano at gmail dot com

Description:
------------
is_link seems to return false for junction points which show up as <JUNCTION> 
when using the DIR command.
It seems to work for junctions which show up as <SYMLINKD> when using the DIR 
command.

tested on php 5.3.27 and 5.4.14 (32 bit of course)

Test script:
---------------
<?php

$paths = array(
  "linksource",
  "linktarget",
  "linktarget2"
);

foreach ( $paths as $path )
{
  echo "----\n $path\n";
  var_dump( is_link( $path ) );
  var_dump( is_dir( $path ) );
  var_dump( array_diff( stat($path), lstat($path) ) );
}

Expected result:
----------------
results of DIR command:

07/09/2013  15:59    <DIR>          linksource
07/09/2013  19:11    <JUNCTION>     linktarget [D:\htdocs\linksource]
18/09/2013  14:30    <SYMLINKD>     linktarget2 [linksource]

Actual result:
--------------
D:\htdocs>php linktest.php
----
 linksource
bool(false)
bool(true)
array(0) {
}
----
 linktarget
bool(false)
bool(true)
array(8) {
  [2]=>
  int(16895)
  [8]=>
  int(1378562389)
  [9]=>
  int(1378562389)
  [10]=>
  int(1378562389)
  ["mode"]=>
  int(16895)
  ["atime"]=>
  int(1378562389)
  ["mtime"]=>
  int(1378562389)
  ["ctime"]=>
  int(1378562389)
}
----
 linktarget2
bool(true)
bool(true)
array(8) {
  [2]=>
  int(16895)
  [8]=>
  int(1378562389)
  [9]=>
  int(1378562389)
  [10]=>
  int(1378562389)
  ["mode"]=>
  int(16895)
  ["atime"]=>
  int(1378562389)
  ["mtime"]=>
  int(1378562389)
  ["ctime"]=>
  int(1378562389)
}


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=65697&edit=1

Reply via email to