File::Copy - 複製檔案或檔案控制代碼
use File::Copy;
copy("sourcefile", "destinationfile") or die "Copy failed: $!";
copy("Copy.pm", \*STDOUT);
move("/dev1/sourcefile", "/dev2/destinationfile");
use File::Copy "cp";
my $n = FileHandle->new("/a/file", "r");
cp($n, "x");
File::Copy 模組提供兩個基本函數,copy
和 move
,這兩個函數可用於將檔案內容從一個地方傳送到另一個地方。
copy
函數需要兩個參數:要複製的檔案和複製到的檔案。任一參數都可以是字串、檔案控制代碼參考或檔案控制代碼 glob。顯然地,如果第一個參數是某種檔案控制代碼,則會從中讀取資料,而如果它是檔案名稱,則會開啟它進行讀取。同樣地,會寫入第二個參數。如果第二個參數不存在,但父目錄存在,則會建立它。嘗試將檔案複製到不存在的目錄會產生錯誤。嘗試將檔案複製到它自己也會產生錯誤。copy
函數不會覆寫唯讀檔案。
如果目的地(第二個參數)已經存在且是目錄,而來源(第一個參數)不是檔案控制代碼,則會將來源檔案複製到目的地指定的目錄中,並使用與來源檔案相同的基本名稱。當目的地是目錄時,將檔案控制代碼作為來源會導致失敗。
請注意,傳遞檔案作為控制代碼而非名稱可能會導致某些作業系統資訊遺失;建議您盡可能使用檔案名稱。檔案會在適用的情況下以二進位模式開啟。若要從檔案控制代碼複製到檔案時獲得一致的行為,請對檔案控制代碼使用 binmode
。
可以使用選擇性的第三個參數來指定用於複製的緩衝區大小。這是來自第一個檔案的位元組數,會在任何特定時間儲存在記憶體中,然後才寫入第二個檔案。預設緩衝區大小取決於檔案,但通常會是整個檔案(最多 2MB),或 1k(對於未參考檔案的檔案控制代碼,例如:socket)。
您可以使用語法 use File::Copy "cp"
來取得此函式的 cp
別名。語法完全相同。行為也幾乎相同:從版本 2.15 開始,cp
會保留來源檔案的權限位元,就像 shell 實用程式 cp(1)
會使用預設選項一樣,而 copy
會使用目標檔案的預設權限(可能取決於程序的 umask
、檔案所有權、繼承的 ACL 等)。也就是說,如果目標檔案已存在,cp
會讓其權限保持不變;否則,權限會從來源檔案取得並由 umask
修改。如果在設定權限時發生錯誤,cp
會傳回 0,無論檔案是否已成功複製。
move
函式也需要兩個參數:要移動的檔案的目前名稱和預期名稱。如果目的地已存在且為目錄,而來源不是目錄,則來源檔案會重新命名為目的地指定的目錄。
如果可能,move() 只會重新命名檔案。否則,它會將檔案複製到新位置並刪除原始檔案。如果在此複製和刪除程序期間發生錯誤,您可能會在目的地名稱下留下(可能是部分)檔案副本。
您可以使用 mv
別名來呼叫此函式,就像您可以使用 cp
別名來呼叫 copy
一樣。
File::Copy 也提供 syscopy
常式,它會將第一個參數中指定的文件複製到第二個參數中指定的文件,並保留作業系統特定的屬性和文件結構。對於 Unix 系統,這等同於簡單的 copy
常式,它不會保留作業系統特定的屬性。對於 VMS 系統,這會呼叫 rmscopy
常式(請參閱下方)。對於 OS/2 系統,這會直接呼叫 syscopy
XSUB。對於 Win32 系統,這會呼叫 Win32::CopyFile
。
如果定義了 syscopy
(OS/2、VMS 和 Win32)的特殊行為:
如果傳遞給 copy
的兩個參數都不是文件處理常式,則 copy
會執行輸入文件的「系統複製」到新的輸出文件,以保留文件屬性、索引文件結構等。會忽略緩衝區大小參數。如果傳遞給 copy
的任一參數都是已開啟文件的處理常式,則會使用 Perl 運算子複製資料,且不會保留文件屬性或記錄結構。
系統複製常式也可以在 VMS 和 OS/2 中直接呼叫為 File::Copy::syscopy
(或在 VMS 中呼叫為 File::Copy::rmscopy
,這是為 syscopy 執行實際工作的常式)。
第一個和第二個參數可以是字串、類型球、類型球參考或繼承自 IO::Handle 的物件;它們在所有情況下都用於取得輸入和輸出文件的檔案規格。輸入文件的檔名和類型會用作輸出文件的預設值(如果需要)。
總是會建立輸出文件的全新版本,它會繼承輸入文件的結構和 RMS 屬性,但擁有者和保護(以及可能的時間戳記;請參閱下方)例外。所有來自輸入文件的資料都會複製到輸出文件;如果傳遞給 rmscopy
的前兩個參數任一是文件處理常式,則其位置不變。(請注意,這表示指向輸出文件的處理常式會在 rmscopy
傳回後與該文件的舊版本關聯,而不是新建立的版本。)
第三個參數是一個整數旗標,它會告訴 rmscopy
如何處理時間戳記。如果它小於 0,則不會將輸入文件任何時間戳記傳播到輸出文件。如果它大於 0,則會將它解釋為位元遮罩:如果設定了第 0 位元(LSB),則會傳播非版次日期的時間戳記;如果設定了第 1 位元,則會傳播版次日期。如果傳遞給 rmscopy
的第三個參數為 0,則它的行為會很像 DCL COPY 指令:如果明確指定了輸出文件的檔名或類型,則不會傳播任何時間戳記,但如果它們是從輸入檔案規格隱含取得,則會傳播非版次日期的所有時間戳記。如果未提供這個參數,則預設為 0。
rmscopy
是 VMS 特定的,且無法匯出;它必須以其完整名稱來參考,例如
File::Copy::rmscopy($from, $to) or die $!;
與 copy
一樣,rmscopy
會在成功時傳回 1。如果發生錯誤,它會設定 $!
、刪除輸出文件,並傳回 0。
所有函式都會在成功時傳回 1,在失敗時傳回 0。如果遇到錯誤,會設定 $!
在對檔案處理呼叫 copy() 或 move() 之前,呼叫者應關閉或 flush() 檔案,以避免寫入遺失。請注意,即使對於 move() 也是如此,因為它實際上可能會複製檔案,具體取決於作業系統特定的實作和底層檔案系統。
File::Copy 由 Aaron Sherman <ajs@ajs.com> 於 1995 年撰寫,並由 Charles Bailey <bailey@newman.upenn.edu> 於 1996 年更新。