手動 fopen/fread/fwrite 實作檔案複製,理解底層運作,或需在複製過程中處理資料 (加密、壓縮、過濾)。
function copyFiles($file1, $file2): bool {
$content = @file_get_contents($file1);
if ($content === false) return false;
$fp = fopen($file2, 'wb');
if (!$fp) return false;
$written = fwrite($fp, $content);
fclose($fp);
return $written !== false;
}
function copyFilesChunked($src, $dest, int $chunkSize = 8192): bool {
$fsrc = fopen($src, 'rb');
$fdest = fopen($dest, 'wb');
if (!$fsrc || !$fdest) return false;
while (!feof($fsrc)) {
$buffer = fread($fsrc, $chunkSize);
if (fwrite($fdest, $buffer) === false) {
fclose($fsrc); fclose($fdest);
return false;
}
}
fclose($fsrc); fclose($fdest);
return true;
}
function copyAndEncrypt($src, $dest, string $key): bool {
$fsrc = fopen($src, 'rb');
$fdest = fopen($dest, 'wb');
if (!$fsrc || !$fdest) return false;
while (!feof($fsrc)) {
$chunk = fread($fsrc, 8192);
$encrypted = openssl_encrypt($chunk, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
fwrite($fdest, $encrypted);
}
fclose($fsrc); fclose($fdest);
return true;
}
| 方法 | 速度 | 記憶體 | 彈性 |
|---|---|---|---|
| copy() | 最快 (C 實作) | 低 | 無 |
| stream_copy_to_stream() | 極快 (核心) | 極低 | 低 |
| file_get_contents + fwrite | 中 | 高 (全檔載入) | 中 |
| 分塊 fread/fwrite | 中 | 極低 (固定緩衝) | 高 (可插入處理) |
一般複製用 copy() 或 stream_copy_to_stream(),需邊複製邊處理才用分塊讀寫。