2012-10-18 172 views
1

我正在使用下面的腳本來分割小卡盤中的大型壓縮文件。使用php腳本以小塊分割大型壓縮文件

$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"; 
} 
?> 

但是這個腳本不會在分割目標臨時文件夾後創建小文件。腳本成功運行,沒有任何錯誤。

請幫我找出這裏有什麼問題?或者如果您有類似功能的其他工作腳本,請提供給我。

+0

爲什麼不調用'exec('split')'? –

+0

不知道,請在這裏解釋或在回答 – Lucifer

+0

,因爲你提到了一個tmp目錄和/ filesep,我們可以假設一個* nix操作系統,並且你的代碼不需要是可移植的?如果是這樣,那麼@ WebnetMobile.com說,從命令提示符/ shell/terminal查看split'man split'。它會把一個文件分割成多個小文件給你。 – Doon

回答

1

如上述註釋中所示,您可以使用split將文件拆分爲更小的片段,然後可以使用cat將它們重新組合在一起。

split -b50m filename x 

,並把他們帶回

cat xaa xab xac > filename 

如果您正在尋找zip文件拆分成跨越式歸檔,這樣就不需要重新加入他們一起看看zipsplit

zipslit -n (size) filename 

所以你可以從你的exec腳本中調用zipsplit,然後大多數標準的unzip utils應該能夠把它放回到一起。 man zipslit獲取更多選項,包括設置輸出路徑等。

+0

我是否應該在php腳本中像這樣使用'exec(split -b50m filename x)'? – Lucifer

+0

'exec('/ path/to/split -b50M filename部分');'''''''''''''''''''''''''''''''' tmp pro.zip'); ' – Doon

+0

嘗試過'exec('zipsplit -n50m -b/tmp pro.zip');'但這沒有做任何事情。我在xampp(windows操作系統)上運行代碼 – Lucifer