PHP / Windows - Opendir () sembolik bağlantılı dizinleri içinde açılması alt dizinleri başarısız

1 Cevap php

Herkes bu soruna bir çözüm biliyor mu? Ben bir symboliclink'd dizin içinde bir alt açamıyorum. Ben yolları (hatta ince çözümlerdi hangi explorer içine yolunu kopyalamak ve yapıştırılan) doğru olup olmadığını teyit ettik. |: Bu garip, rahatsız edici, hatadır.

Example:

C: \ klasör \ symbolic_link \ dir1 \ dir2 - açılış dir2 başarısız olur.

C: \ klasör \ symbolic_link \ dir1 - çalışıyor

C: \ klasör \ real_directory \ dir1 \ dir2 - çalışıyor

C: \ klasör \ real_directory \ dir1 - çalışıyor

1 Cevap

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.