2012-10-18 91 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