2016-02-07 108 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]; 
} 

的通知。