2012-11-11 34 views
1

我正試圖在同一文件系統上的目錄之間移動文件。我遇到的困難是,當我使用rename()時,文件系統上該文件的文件訪問時間會發生變化。重命名導致文件訪問時間發生變化

我嘗試使用shell_exec() mv,但由於某種原因,當我以這種方式調用mv時,它會複製文件,然後刪除需要更長時間的原件。

有沒有辦法在不改變訪問時間的情況下快速移動文件?或者我可以在撥打rename()後將它改回來嗎?

回答

1

作爲一般規則,當文件的訪問時間必須在像rename()這樣的函數或訪問文件的任何其他函數執行時更改。

至於改變文件的訪問時間。這是唯一可能的使用touch功能,如手冊中所述:

bool touch (string $filename [, int $time = time() [, int $atime ]]) 

嘗試以設置文件名參數在時間給定的值指定的文件的訪問和修改時間。請注意,無論參數的數量如何,訪問時間總是會被修改。

正如可以看到時間參數手冊中被描述爲:

touch time 

如果未提供時,當前系統時間被使用。

這裏是從一個文件中設置訪問一小時的時間回到同一頁面的例子:

<?php 
    // This is the touch time, we'll set it to one hour in the past. 
    $time = time() - 3600; 

    // Touch the file 
    if (!touch('some_file.txt', $time)) { 
     echo 'Whoops, something went wrong...'; 
    } else { 
     echo 'Touched file with success'; 
    } 
?> 

但要注意的是,觸摸功能,如上所述,嘗試到更改文件。例如,如果您沒有權限,該功能將返回false。 (並不會改變文件時間)

乾杯

+0

感謝您的幫助,看起來好像重命名仍然需要一段時間來複制文件,所以病毒堅持到shell_exec選項。你知道有什麼方法來移動文件只是更新文件系統,而不需要複製/刪除文件? – jimmyjambles

+0

在某些文件系統中,所有需要將諸如/foo/bar/file.extension這樣的文件移動到/foo/file.extension的文件系統都將文件重命名爲/foo/file.extension。所以這是一種不復制的方式。但是沒有辦法在不刪除文件的情況下移動文件。 (順便說一句,這是另一個問題) –

1

可以使用fileatime臨時存儲的文件的訪問時間和使用touch修改。

$filename = 'somefile.txt'; 
$original_timestamp = fileatime($filename); 
// .. modify file here .. 
touch($filename, $original_timestamp); 
相關問題