1

大きなzipファイルを小さなチャックに分割するために以下のスクリプトを使用しています。

$filename = "pro.zip"; 
$targetfolder = '/tmp';

// File size in Mb per piece/split. 
// For a 200Mb file if piecesize=10 it will create twenty 10Mb files
$piecesize = 10; // splitted file size in MB


$buffer = 1024;
$piece = 1048576*$piecesize;
$current = 0;
$splitnum = 1;

if(!file_exists($targetfolder)) {
    if(mkdir($targetfolder)) {
        echo "Created target folder $targetfolder".br();
    }
}

if(!$handle = fopen($filename, "rb")) {
    die("Unable to open $filename for read! Make sure you edited filesplit.php correctly!".br());
}

$base_filename = basename($filename);

$piece_name = $targetfolder.'/'.$base_filename.'.'.str_pad($splitnum, 3, "0", STR_PAD_LEFT);
if(!$fw = fopen($piece_name,"w")) {
    die("Unable to open $piece_name for write. Make sure target folder is writeable.".br());
}
echo "Splitting $base_filename into $piecesize Mb files ".br()."(last piece may be smaller in size)".br();
echo "Writing $piece_name...".br();
while (!feof($handle) and $splitnum < 999) {
    if($current < $piece) {
        if($content = fread($handle, $buffer)) {
            if(fwrite($fw, $content)) {
                $current += $buffer;
            } else {
                die("filesplit.php is unable to write to target folder");
            }
        }
    } else {
        fclose($fw);
        $current = 0;
        $splitnum++;
        $piece_name = $targetfolder.'/'.$base_filename.'.'.str_pad($splitnum, 3, "0", STR_PAD_LEFT);
        echo "Writing $piece_name...".br();
        $fw = fopen($piece_name,"w");
    }
}
fclose($fw);
fclose($handle);
echo "Done! ".br();
exit;

function br() {
    return (!empty($_SERVER['SERVER_SOFTWARE']))?'<br>':"\n";
}
?> 

ただし、このスクリプトは、ターゲットの一時フォルダーで分割した後、小さなファイルを作成しません。スクリプトはエラーなしで正常に実行されます。

ここで何が問題なのかを知るのを手伝ってください。または、同様の機能のために他に機能するスクリプトがある場合は、私に提供してください。

4

1 に答える 1

1

上記のコメントに示されているように、 を使用splitしてファイルを小さな断片に分割し、 を使用catしてそれらを結合することができます。

split -b50m filename x

そしてそれらを元に戻す

 cat xaa xab xac > filename

zipfile をスパン タイプのアーカイブに分割して、それらを再結合する必要がないようにする場合は、以下を参照してください。zipsplit

 zipslit -n (size) filename  

そのため、実行スクリプトから zipsplit を呼び出すだけで、ほとんどの標準的な unzip ユーティリティで元に戻すことができます。 man zipslit出力パスの設定など、その他のオプションについては.

于 2012-10-18T11:36:22.700 に答える