2016-02-07 72 views
0

我遇到了一个问题,我想让输出告诉我哪些文件具有相同的inode,例如“filename1和filename2是相同的”。这将是如果两个inode是相同的,但我不知道如何应用这个。我目前正在尝试创建一个数组,其中的键是文件的名称,值是inode,但它不工作(var_dump只是给了我一个空的数组)。比较值和检查重复项

如果我以某种方式让数组工作,那么我猜我需要通过它以某种方式递增并检查两个值是否相同然后打印它们的键。

global $hardlink; 
    $hardlink = []; 

    foreach (glob("*") as $filename) { 
     file_info($filename); 
     print_file_info(); 
    } 

    var_dump($hardlink); 
    exit(0); 

    function file_info($name) { 
     global $info;     
     $info[0] = $name;   // the file name 
     $info[1] = filesize($name); // file size 
     $info[2] = filetype($name); // file type 

     $cwd = getcwd(); 
     $path = "$cwd/$name"; 

     if(is_link($path)) { 
      $link = readlink($path); 
      $info[3] = "-> $link"; 
     } else { 
      $info[3] = "No link"; 
     } 

     $lstat = lstat($path); 
     $info[4] = $lstat[1]; 

     $hardlink[$info[0]] = $info[4]; 
    } 

回答

0

尝试增加$hardlink在你的函数全球行:

function file_info($name) { 
    global $info, $hardlink; 
+0

工作,非常感谢。如果可能的话,你能建议我如何检查两个文件inode,并将这些键打印出相同的值吗?像array_intersect?因此,我可以输出“这些文件具有相同的inode:filename1,filename2” – Xylus

+0

@Xylus,这超出了问题的范围,如果无法弄清楚,请打开一个新问题。 PHP手册有很多例子,但我希望你能阅读并理解我的答案。如果你想编写好的代码,你将完全避免使用全局变量。 – Devon

+0

@Devon再次感谢。我会查看PHP手册并尝试自己找出问题所在。 – Xylus

0

你必须与你的变量范围的一个普遍问题。这是你不应该依赖全局变量的原因之一。

$hardlink是函数file_info()内部的一个局部变量,不是全局变量,因此无论您做什么更改都不会出现在全局范围内。

要更好地解决此问题,请删除全局声明并传递参考。我已经通过用&前缀它定义$硬链接作为FILE_INFO函数的第二个参数的引用

$hardlink = []; 

foreach (glob("*") as $filename) { 
    file_info($filename, $hardlink); 
    print_file_info(); 
} 

function file_info($name, &$hardlink) { 
    $info[0] = $name;   // the file name 
    $info[1] = filesize($name); // file size 
    $info[2] = filetype($name); // file type 

    $cwd = getcwd(); 
    $path = "$cwd/$name"; 

    if(is_link($path)) { 
     $link = readlink($path); 
     $info[3] = "-> $link"; 
    } else { 
     $info[3] = "No link"; 
    } 

    $lstat = lstat($path); 
    $info[4] = $lstat[1]; 

    $hardlink[$info[0]] = $info[4]; 
} 

的通知。