Tamam, ben nihayet windows yollarda bazı php alınmasında bu hatayı çözmek için bir hack buldum. Recursively opendir()
kullanarak dosya / dizin yineleme sırasında hata oluşur. Bir dizine bir sembolik geçerli dizinde varsa, opendir()
dizin sembolik bağ olarak dizinleri okumak için başarısız olur. Bu dizin sembolik bağı üzerine opendir()
çağırmadan önce php statcache korkak bir şey neden olur, ve clearstatcache()
arayarak çözülebilir (aynı zamanda, üst dizinin dosya tanıtıcı kapalı olmalıdır).
Burada düzeltmenin bir örneği aşağıda verilmektedir:
<?php
class Filesystem
{
public static function files($path, $stats = FALSE)
{
clearstatcache();
$ret = array();
$handle = opendir($path);
$files = array();
// Store files in directory, subdirectories can't be read until current handle is closed & statcache cleared.
while (FALSE !== ($file = readdir($handle)))
{
if ($file != '.' && $file != '..')
{
$files[] = $file;
}
}
// Handle _must_ be closed before statcache is cleared, cache from open handles won't be cleared!
closedir($handle);
foreach ($files as $file)
{
clearstatcache($path);
if (is_dir($path . '/' . $file))
{
$dir_files = self::files($path . '/' . $file);
foreach ($dir_files as $dir_file)
{
$ret[] = $file . '/' . $dir_file;
}
}
else if (is_file($path . '/' . $file))
{
$ret[] = $file;
}
}
return $ret;
}
}
var_dump(filessystem::files('c:\\some_path'));
Edit: O clearstatcache($path)
symlink'd dir herhangi bir dosya işleme fonksiyonları önce çağrılması gerekir gibi görünüyor. Php düzgün symlink'd dirs önbelleğe değildir.