內容

名稱

File::Temp - 安全地傳回暫存檔的名稱和控制代碼

版本

版本 0.2311

語法

use File::Temp qw/ tempfile tempdir /;

$fh = tempfile();
($fh, $filename) = tempfile();

($fh, $filename) = tempfile( $template, DIR => $dir);
($fh, $filename) = tempfile( $template, SUFFIX => '.dat');
($fh, $filename) = tempfile( $template, TMPDIR => 1 );

binmode( $fh, ":utf8" );

$dir = tempdir( CLEANUP => 1 );
($fh, $filename) = tempfile( DIR => $dir );

物件介面

require File::Temp;
use File::Temp ();
use File::Temp qw/ :seekable /;

$fh = File::Temp->new();
$fname = $fh->filename;

$fh = File::Temp->new(TEMPLATE => $template);
$fname = $fh->filename;

$tmp = File::Temp->new( UNLINK => 0, SUFFIX => '.dat' );
print $tmp "Some data\n";
print "Filename is $tmp\n";
$tmp->seek( 0, SEEK_END );

$dir = File::Temp->newdir(); # CLEANUP => 1 by default

提供下列介面,以相容於現有 API。不應在新的程式碼中使用。

MkTemp 家族

use File::Temp qw/ :mktemp  /;

($fh, $file) = mkstemp( "tmpfileXXXXX" );
($fh, $file) = mkstemps( "tmpfileXXXXXX", $suffix);

$tmpdir = mkdtemp( $template );

$unopened_file = mktemp( $template );

POSIX 函式

use File::Temp qw/ :POSIX /;

$file = tmpnam();
$fh = tmpfile();

($fh, $file) = tmpnam();

相容性函式

$unopened_file = File::Temp::tempnam( $dir, $pfx );

說明

File::Temp 可用於安全地建立和開啟暫存檔。同時提供函式介面和物件導向介面。File::Temp 建構函式或 tempfile() 函式可傳回暫存檔的名稱和開啟檔案控制代碼。tempdir() 函式可建立暫存目錄。

特別強調暫存檔建立的安全性,因此會同時傳回檔案控制代碼和檔名。這有助於確保不會發生競爭情況,也就是在檢查檔案是否存在和開啟檔案之間,暫存檔不會被其他處理程序建立。提供其他安全層級,例如檢查具有寫入權限的目錄是否設定黏著位元。有關更多資訊,請參閱 "safe_level"

為了與流行的 C 函式庫函式相容,Perl 提供了 mkstemp() 函式家族的實作。這些函式包括 mkstemp()、mkstemps()、mkdtemp() 和 mktemp()。

此外,如果需要,還會提供標準 POSIX tmpnam() 和 tmpfile() 函式的實作。

提供 mktemp()、tmpnam() 和 tempnam() 的實作,但應謹慎使用,因為它們只會傳回呼叫函式時有效的檔名,因此無法保證呼叫者開啟檔名時檔案不存在。

這些函式傳回的檔案代號支援可尋址的方法。

物件導向介面

這是與 File::Temp 互動的主要介面。使用物件導向介面,可以在建立物件時建立暫時檔案,並可以在不再需要物件時移除檔案。

請注意,沒有方法可以從 File::Temp 物件取得檔案代號。物件本身充當檔案代號。物件是 IO::HandleIO::Seekable,因此可以使用所有這些方法。

此外,物件已設定為字串化為暫時檔案的名稱,因此可以直接與檔名進行比較。它會將 refaddr 數值化,與其他代號相同,因此可以使用 == 與其他代號進行比較。

$fh eq $filename       # as a string
$fh != \*STDOUT        # as a number

自 0.14 起提供。

new

建立暫時檔案物件。

my $tmp = File::Temp->new();

預設情況下,物件的建立方式就像在沒有選項的情況下呼叫 tempfile,但額外的行為是,如果將 UNLINK 設定為 true(預設值),則暫時檔案會由物件的解構函式移除。

支援的引數與 tempfile 相同:UNLINK(預設為 true)、DIR、EXLOCK、PERMS 和 SUFFIX。此外,使用 TEMPLATE 選項指定檔名範本。不支援 OPEN 選項(檔案總是開啟)。

$tmp = File::Temp->new( TEMPLATE => 'tempXXXXX',
                       DIR => 'mydir',
                       SUFFIX => '.dat');

引數不分大小寫。

如果發生錯誤,可以呼叫 croak()。

自 0.14 起提供。

自 0.23 起提供 TEMPLATE

newdir

使用物件導向介面建立暫存目錄。

$dir = File::Temp->newdir();

預設情況下,當物件超出作用範圍時,目錄會被刪除。

支援與 tempdir 函式相同的選項。請注意,使用此方法建立的目錄預設為 CLEANUP => 1。

$dir = File::Temp->newdir( $template, %options );

範本可以使用前置範本或 TEMPLATE 參數指定。

自 0.19 起提供。

自 0.23 起提供 TEMPLATE。

filename

傳回與此物件相關聯的暫存檔案名稱(如果物件是使用「new」建構函式建立的)。

$filename = $tmp->filename;

當物件用作字串時,此方法會自動呼叫。

自 0.14 起提供目前的 API

dirname

傳回與此物件相關聯的暫存目錄名稱(如果物件是使用「newdir」建構函式建立的)。

$dirname = $tmpdir->dirname;

當物件在字串內容中使用時,此方法會自動呼叫。

控制當物件超出作用範圍時是否取消連結檔案。如果此值為 true 且 $KEEP_ALL 不為 true,則會移除檔案。

$fh->unlink_on_destroy( 1 );

預設會移除檔案。

自 0.15 起提供目前的 API

DESTROY

當物件超出作用範圍時,會呼叫解構函式。如果建構函式是以 UNLINK 設為 1(如果未指定 UNLINK,則為預設狀態)呼叫的,則此解構函式會嘗試取消連結檔案(使用 unlink1)。

如果取消連結失敗,則不會傳回錯誤。

如果物件在 fork 期間傳遞給子程序,則當物件在父項中超出作用範圍時,檔案會被刪除。

對於臨時目錄物件,除非在建構函數中使用 CLEANUP 參數(並設為 false)或在建立後修改 unlink_on_destroy,否則將移除目錄。請注意,如果臨時目錄為您的目前目錄,則無法移除它 - 在這種情況下會發出警告。在讓物件超出範圍之前,請使用 chdir() 離開目錄。

如果全域變數 $KEEP_ALL 為 true,則不會移除檔案或目錄。

函數

本節說明建議的用於產生臨時檔案和目錄的介面。

tempfile

這是產生臨時檔案的基本函數。可以使用各種選項變更檔案的行為

$fh = tempfile();
($fh, $filename) = tempfile();

在指定為臨時檔案的目錄中建立臨時檔案,如 File::Spec 中的 tmpdir() 函數所指定。

($fh, $filename) = tempfile($template);

使用提供的範本在目前目錄中建立臨時檔案。尾隨的 `X' 字元會以隨機字母取代以產生檔名。範本尾端必須至少有四個 `X' 字元。

($fh, $filename) = tempfile($template, SUFFIX => $suffix)

與先前相同,只不過在 `X' 轉換後會將字尾新增至範本。這對於確保臨時檔名在其他應用程式需要時具有特定副檔名很有用。但請參閱最後的警告。

($fh, $filename) = tempfile($template, DIR => $dir);

與先前相同,只不過會指定目錄名稱。

($fh, $filename) = tempfile($template, TMPDIR => 1);

等於指定 DIR 為「File::Spec->tmpdir」,將檔案寫入與未指定任何範本時所使用的相同臨時目錄中。

($fh, $filename) = tempfile($template, UNLINK => 1);

傳回檔名和檔案控制代碼,與先前相同,只不過檔案會在程式結束時自動移除(取決於 $KEEP_ALL)。預設為如果要求檔案控制代碼,則移除檔案;如果要求檔名,則保留檔案。在純量內容(未傳回檔名)中,檔案會在結束時(取決於作業系統)或關閉時(除非在建立臨時檔案時 $KEEP_ALL 為 true)永遠刪除。

如果需要精細控制移除檔案的時間,請使用物件導向介面。

如果未指定範本,則會自動產生範本。此臨時檔案會放置在 tmpdir() (File::Spec) 中,除非使用 DIR 選項明確指定目錄。

$fh = tempfile( DIR => $dir );

如果在純量內容中呼叫,則只會傳回檔案控制代碼,而檔案會在支援此功能的作業系統上關閉時自動刪除(請參閱本文檔其他地方的 tmpfile() 說明)。這是首選的操作模式,因為如果您只有一個檔案控制代碼,則永遠不會因為檔案名稱而產生競爭條件。在無法取消連結開啟檔案或無法在開啟時將檔案標記為臨時檔案的系統上(例如,Windows NT 使用 O_TEMPORARY 旗標),則會在程式結束時標記檔案以供刪除(等於將 UNLINK 設為 1)。如果存在,則會忽略 UNLINK 旗標。

(undef, $filename) = tempfile($template, OPEN => 0);

這將根據範本傳回檔名,但不會開啟此檔案。無法與設定為 true 的 UNLINK 搭配使用。預設值是為了保護免於可能的競爭條件而始終開啟檔案。如果開啟警告,則會發出警告。請考慮使用此文件其他地方所述的 tmpnam() 和 mktemp() 函式,如果不需要開啟檔案的話。

若要以 O_EXLOCK 開啟暫時檔案控制代碼 (以獨佔檔案鎖定開啟),請使用 EXLOCK=>1。這僅受部分作業系統支援 (最著名的是源自 BSD 的系統)。預設情況下,EXLOCK 會為 false。以前的 File::Temp 版本將 EXLOCK 設定為 true,因此若要確保也能使用舊版本取得未鎖定的檔案控制代碼,請明確設定 EXLOCK=>0

($fh, $filename) = tempfile($template, EXLOCK => 1);

預設情況下,暫時檔案會以 0600 檔案權限建立。請使用 PERMS 來變更此設定

($fh, $filename) = tempfile($template, PERMS => 0666);

可以視需要合併選項。

如果有錯誤,將會 croak()。

自 0.05 起提供。

自 0.10 起提供 UNLINK 旗標。

自 0.19 起提供 TMPDIR 旗標。

自 0.19 起提供 EXLOCK 旗標。

自 0.2310 起提供 PERMS 旗標。

tempdir

這是建立暫時目錄的建議介面。預設情況下,目錄不會在結束時移除 (亦即,它不會是暫時的;由於向後相容性的問題,無法變更此行為)。若要啟用移除,請使用 CLEANUP 選項,這會在程式結束時觸發移除,或考慮使用物件介面中的「newdir」方法,這將允許在物件超出範圍時清除目錄。

函式的行為取決於引數

$tempdir = tempdir();

在 tmpdir() 中建立目錄 (請參閱 File::Spec)。

$tempdir = tempdir( $template );

從提供的範本建立目錄。此範本類似於 tempfile() 所述的範本。範本末尾的「X」字元會以隨機字母取代,以建構目錄名稱。範本中必須至少有四個「X」字元。

$tempdir = tempdir ( DIR => $dir );

指定用於暫時目錄的目錄。暫時目錄名稱來自於內部範本。

$tempdir = tempdir ( $template, DIR => $dir );

將提供的目錄名稱加到範本前面。範本本身不應包含父目錄規格。在加到提供的目錄前面之前,會從範本中移除任何父目錄規格。

$tempdir = tempdir ( $template, TMPDIR => 1 );

使用提供的範本,在暫時檔案的標準位置建立暫時目錄。等同於執行

$tempdir = tempdir ( $template, DIR => File::Spec->tmpdir);

但較短。父目錄規格從範本本身移除。如果明確設定 DIR,則會忽略 TMPDIR 選項。此外,如果未提供範本或目錄,則會暗示 TMPDIR

$tempdir = tempdir( $template, CLEANUP => 1);

使用提供的範本建立暫時目錄,但嘗試在程式結束時移除它(以及其中的所有檔案)。請注意,即使這些檔案不是由這個模組建立的,也會嘗試從目錄中移除所有檔案(否則為何要求清理它?)。目錄移除是使用 File::Path 模組中的 rmtree() 函數進行的。當然,如果未指定範本,則會在 tmpdir() 中建立暫時目錄,並在程式結束時移除它。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

MKTEMP 函數

下列函數是 mktemp() 系列暫時檔案產生系統呼叫的 Perl 實作。

mkstemp

提供範本後,會傳回暫時檔案的檔案控制代碼和檔案名稱。

($fh, $name) = mkstemp( $template );

在純量內容中,只會傳回檔案控制代碼。

範本可以是任何附加一些 X 的檔案名稱,例如 /tmp/temp.XXXX。尾端的 X 會替換為獨特的英數字組合。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

mkstemps

類似於 mkstemp(),但可以提供額外引數,其中包含要附加到範本的字尾。

($fh, $name) = mkstemps( $template, $suffix );

例如,範本為 testXXXXXX,字尾為 .dat,會產生類似於 testhGji_w.dat 的檔案。

在純量內容中呼叫時,只會傳回檔案控制代碼。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

mkdtemp

從範本建立目錄。範本必須以 X 結尾,這些 X 會由常式取代。

$tmpdir_name = mkdtemp($template);

傳回建立的暫時目錄名稱。

目錄必須由呼叫者移除。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

mktemp

傳回有效的暫時檔案名稱,但不保證檔案不會被其他人開啟。

$unopened_file = mktemp($template);

範本與 mkstemp() 所需的範本相同。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

POSIX 函數

此部分說明如何使用此模組中的 mkstemp() 重新實作 POSIX 中所述的 tmpnam() 和 tmpfile() 函式。

POSIX 實作不同,暫存檔所使用的目錄並未指定在系統包含檔 (P_tmpdir) 中,而是單純取決於 File::Spec 所傳回的 tmpdir() 選項。在某些實作中,此位置可以使用 TMPDIR 環境變數設定,但可能不安全。如果這是個問題,請直接使用 mkstemp() 並指定範本。

tmpnam

在純量內容中呼叫時,會傳回暫存檔的完整名稱 (包含路徑) (使用 mktemp())。唯一的檢查是檔案尚未存在,但無法保證此條件會持續適用。

$file = tmpnam();

在清單內容中呼叫時,會傳回開啟檔案的檔案控制代碼和檔案名稱。這是透過在建構合適範本後呼叫 mkstemp() 來達成。

($fh, $file) = tmpnam();

如果可能,應使用此表單以避免可能的競爭條件。

請參閱 File::Spec 中的「tmpdir」,以取得特定作業系統暫存目錄選項的資訊。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

tmpfile

傳回暫存檔的檔案控制代碼。

$fh = tmpfile();

當檔案控制代碼關閉或程式結束時,會移除檔案。無法存取檔案名稱。

如果無法建立暫存檔,會傳回未定義。目前此指令在暫存目錄位於 NFS 檔案系統時,可能會無法運作。

如果有錯誤,將會 croak()。

自 0.05 起提供。

在 0.12 中新增,如果無法建立檔案,會傳回未定義。

其他函式

提供這些函式以向後相容於常見的 tempfile 產生 C 函式庫函式。

這些函式未匯出,而且必須使用完整的套件名稱來呼叫。

tempnam

使用前綴傳回指定目錄中暫存檔的名稱。保證在呼叫函式時檔案不存在,但此保證僅持續一個時脈週期。如果您必須開啟此類檔案名稱,請務必使用 O_CREAT | O_EXCL 搭配適當的 sysopen 表單。

$filename = File::Temp::tempnam( $dir, $prefix );

等於執行 mktemp() 與 $dir/$prefixXXXXXXXX (以 unix 檔案慣例為例)

由於此函式使用 mktemp(),因此可能會發生競爭條件。

如果有錯誤,將會 croak()。

自 0.05 起可用的目前 API。

公用函式

處理檔案句柄和檔案名稱時有用的函數。

unlink0

給定一個開啟的檔案句柄和相關的檔案名稱,執行安全的 unlink。這是透過先檢查檔案名稱和檔案句柄最初指向同一個檔案,以及檔案的連結數為 1(比較 stat() 回傳的所有欄位)來達成。接著取消連結檔案名稱,並再次檢查檔案句柄,以驗證該檔案的連結數現在為 0。這是最接近確定取消連結的檔案名稱與您持有其描述詞的檔案相同的方法。

unlink0($fh, $path)
   or die "Error unlinking file $path safely";

發生錯誤時回傳 false,但如果有安全異常則會 croaks()。檔案句柄不會關閉,因為在某些情況下不需要這麼做。

在某些平台上,例如 Windows NT,無法取消連結開啟的檔案(必須先關閉檔案)。在這些平台上,實際的取消連結會延後到程式結束,並回傳良好狀態。仍會執行檢查,以確保檔案句柄和檔案名稱指向同一個項目(但不會在執行 end 區塊時執行檢查,因為延後移除可能無法存取檔案句柄)。

此外,在 Windows NT 上,無法比較 stat() 回傳的所有欄位。例如,devrdev 欄位似乎不同。此外,stat() 回傳的檔案大小似乎並不總是相符,其中 stat(FH)stat(filename) 更精確,可能是因為快取問題,即使使用自動快取清除也是如此(通常透過在寫入暫存檔後等待一段時間,再嘗試對其執行 unlink0 來克服這個問題)。

最後,在 NFS 檔案系統上,檔案句柄的連結數並不會在取消連結後立即變為零。目前,預期此指令會在 NFS 磁碟上失敗。

如果全域變數 $KEEP_ALL 為 true,且支援取消連結開啟的檔案,則此函數會停用。如果取消連結要延後到 END 區塊,則檔案仍會註冊為要移除的項目。

如果您使用物件導向介面,則不應呼叫此函數,因為它會干擾物件解構函式刪除檔案。

自 0.05 起提供。

如果無法取消連結開啟的檔案,則延後移除,自 0.06 起提供。

cmpstat

將檔案控制代碼的 stat 與提供的檔案名稱的 stat 進行比較。這可以用於檢查檔案名稱和檔案控制代碼最初指向同一個檔案,且檔案的連結數為 1(會比較 stat() 回傳的所有欄位)。

cmpstat($fh, $path)
   or die "Error comparing handle with file";

如果 stat 資訊不同或連結數大於 1,則回傳 false。如果出現安全異常,則呼叫 croak

在某些平台上,例如 Windows,並非 stat() 回傳的所有欄位都能用於比較。例如,devrdev 欄位在 Windows 中似乎不同。此外,stat() 回傳的檔案大小似乎也不總是相符,其中 stat(FH)stat(filename) 更精確,這可能是因為快取問題,即使在使用自動快取時也是如此(這通常可以在寫入暫存檔後等待一段時間,再嘗試 unlink0 它時解決)。

預設未匯出。

目前的 API 可用於 0.14 以後版本。

unlink1

類似於 unlink0,但在使用 cmpstat 進行檔案比較後,在嘗試取消連結檔案之前會關閉檔案控制代碼。這允許在不使用 END 區塊的情況下移除檔案,但表示 unlink0 提供的檔案控制代碼狀態在取消連結後的比較不可用。

unlink1($fh, $path)
   or die "Error closing and unlinking file";

通常在使用物件導向介面時,從物件解構函式呼叫。

預設未匯出。

如果全域變數 $KEEP_ALL 為 true,則停用此函式。

如果在 stat() 比較期間出現安全異常,則會呼叫 croak()

目前的 API 可用於 0.14 以後版本。

cleanup

呼叫此函式將導致移除任何已註冊要移除的暫存檔或暫存目錄。這會在程序結束時自動發生,但如果呼叫者確定不需要任何暫存檔,則可以手動觸發。此方法可以註冊為 Apache 回呼。

請注意,如果暫存目錄是您的目前目錄,則無法移除它。在呼叫 cleanup() 之前,請先使用 chdir() 離開目錄。(對於在設定 CLEANUP 旗標時在程式結束時進行清理,這會自動發生。)

在暫存檔在關閉時會自動移除的作業系統上,呼叫此函式除了移除暫存目錄(可能包含暫存檔)之外,不會產生其他影響。

File::Temp::cleanup();

預設未匯出。

目前的 API 可用於 0.15 以後版本。

套件變數

這些函式控制套件的整體狀態。

safe_level

控制模組將採取的長度,以檢查暫時檔案或目錄的安全性,然後再繼續執行。選項為

標準

執行基本安全措施,以確保目錄存在且可寫入,僅在暫時檔案不存在時才開啟,並避免可能的競爭條件。最後,unlink0 函式用於安全地移除檔案。

中級

除了標準安全性外,還會檢查輸出目錄,以確保它是由 root 或執行程式之使用者擁有。如果目錄可由群組或其他使用者寫入,則會檢查以確保已設定黏著位元。

不會在不支援黏著位元的 -k 測試的平台上執行。

高級

除了中級安全性檢查外,還會使用 POSIX sysconf() 函式檢查 ``chown() giveaway'' 的可能性。如果這是可能的,則會依序檢查路徑中的每個目錄的安全性,遞迴地返回根目錄。

對於不支援 POSIX _PC_CHOWN_RESTRICTED 符號的平台(例如 Windows NT),假設 ``chown() giveaway'' 是可能的,並執行遞迴測試。

層級可以如下變更

File::Temp->safe_level( File::Temp::HIGH );

層級常數不會由模組匯出。

目前,您必須至少執行 perl v5.6.0 才能以中級或高級安全性執行。這只是因為安全性測試使用 Fcntl 中的函式,而這些函式在舊版 perl 中不可用。問題在於 Fcntl 的版本號在 perl 5.6.0 和 5.005_03 中相同,即使它們是不同的版本。

在不支援高級或中級安全性層級的系統上(例如 Win NT 或 OS/2),任何變更層級的嘗試都將被忽略。忽略而不是引發例外的決定允許編寫可攜式程式,並考慮到系統的高安全性,而不會讓這些程式在額外測試不相關的系統上失敗。

如果您真的需要查看變更是否已接受,只需檢查 safe_level 的傳回值即可。

$newlevel = File::Temp->safe_level( File::Temp::HIGH );
die "Could not change to high security"
    if $newlevel != File::Temp::HIGH;

自 0.05 起提供。

TopSystemUID

這是當前系統上最高 UID,用於指稱 root UID。這用於確保暫存目錄是由系統 UID (rootbinsys 等) 擁有,而不是僅由 root 擁有。

這是必要的,因為在許多 unix 系統上,/tmp 並非由 root 擁有。

預設假設小於或等於 10 的任何 UID 都是 root UID。

File::Temp->top_system_uid(10);
my $topid = File::Temp->top_system_uid;

可以調整此值,以在需要時減少安全性檢查。此值僅在 safe_level 設為 MEDIUM 或更高時才相關。

自 0.05 起提供。

$KEEP_ALL

控制是否應保留暫存檔案和目錄,而不論程式中是否有任何自動移除它們的指示。這對於除錯很有用,但不要用於生產程式碼。

$File::Temp::KEEP_ALL = 1;

預設是根據呼叫者的要求移除檔案。

在某些情況下,只有當建立檔案時此變數為 true,檔案才會被保留。這表示您無法建立暫存檔案、設定此變數,並預期程式結束時暫存檔案仍存在。

$DEBUG

控制是否應啟用除錯訊息。

$File::Temp::DEBUG = 1;

預設是停用除錯模式。

自 0.15 起可用。

警告

為了最大安全性,請務必避免查看、觸碰,甚至輸入檔案名稱的存在。您不知道該檔案名稱是否與您擁有的控制代碼連接,而嘗試檢查此問題只會觸發更多競爭條件。僅使用檔案控制代碼並完全放棄檔案名稱會更安全。

如果您需要將控制代碼傳遞給需要檔案名稱的某些內容,則在 unix 系統上,您可以對任意程式使用 "/dev/fd/" . fileno($fh)。使用 open 的 2 個引數版本的 Perl 程式碼可以傳遞 "+<=&" . fileno($fh)。否則,您需要傳遞檔案名稱。您必須清除該檔案描述符上的 close-on-exec 位元,然後才能將其傳遞給另一個處理程序。

use Fcntl qw/F_SETFD F_GETFD/;
fcntl($tmpfh, F_SETFD, 0)
    or die "Can't clear close-on-exec flag on temp fh: $!\n";

臨時檔案和 NFS

使用存在於 NFS 檔案系統上的臨時檔案會產生一些問題,建議盡可能使用本機檔案系統。如果臨時檔案不是本機檔案,某些安全性測試很可能會失敗。此外,請注意,透過 NFS 進行的 I/O 作業效能不會像本機磁碟一樣好。

分岔

在某些情況下,File::Temp 建立的檔案會從 END 區塊中移除。由於 END 區塊會在子程序結束時觸發(除非子程序使用 POSIX::_exit()),File::Temp 會特別注意只移除由特定程序 ID 建立的臨時檔案。這表示子程序不會嘗試移除由父程序建立的臨時檔案。

如果您並行分岔許多程序,而這些程序都會建立臨時檔案,您可能需要在每個子程序中使用 srand(EXPR) 重設亂數種子,否則所有子程序都會嘗試遍歷同一組亂數檔案名稱,並且如果超過重試次數,可能會導致它們放棄。

目錄移除

請注意,如果您已 chdir 到臨時目錄中,並且它隨後被清理(在 END 區塊中或作為物件毀損的一部分),您將會收到 File::Path::rmtree() 的警告。

污染模式

如果您需要在污染模式下執行程式碼,強烈建議更新到最新的 File::Spec。在 Windows 上,如果 File::Spec::tmpdir 給定的目錄不可寫入,File::Temp 將嘗試回退到使用者的本機應用程式資料目錄,或以錯誤訊息中斷。

BINMODE

如果此類模式可用,File::Temp 回傳的檔案將會以二進位模式開啟。如果這不正確,請使用 binmode() 函式變更檔案控制代碼的模式。

請注意,您也可以使用 binmode() 來修改 File::Temp 開啟的檔案編碼。

歷史

最初於 1999 年 5 月開始,作為系統 mkstemp() 函式的 XS 介面。2000 年 3 月,OpenBSD mkstemp() 程式碼被轉譯成 Perl,以完全控制程式碼的安全檢查,確保此函式存在於任何作業系統中,並協助移植性。此模組從 perl v5.6.1 開始作為 perl 的標準部分。

感謝 Tom Christiansen 建議撰寫此模組,並提供程式碼改進和安全性增強的想法。

另請參閱

POSIX 中的「tmpnam」POSIX 中的「tmpfile」File::SpecFile::Path

請參閱 IO::FileFile::MkTempApache::TempFile,以取得暫存檔案處理的不同實作。

請參閱 File::Tempdir,以取得 tempdir 函式的替代物件導向包裝器。

支援

錯誤可透過 RT 錯誤追蹤器 (或 bug-File-Temp@rt.cpan.org) 提交。

此套件的使用者也可使用郵寄清單,網址為 http://lists.perl.org/list/cpan-workers.html

此套件的使用者也可使用 IRC 頻道,網址為 #toolchain on irc.perl.org

作者

Tim Jenness <tjenness@cpan.org>

貢獻者

著作權和授權

此軟體的著作權為 (c) 2020 Tim Jenness 和英國粒子物理和天文研究委員會所有。

這是自由軟體;您可以在與 Perl 5 程式語言系統相同的條款下重新散布或修改它。