Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Разбить файл на части


Автор: Borland_Delphi_6 15.1.2005, 14:40
Как можно разбить бинарник на части, чтобы его потом еще и собрать реально было? smile

Автор: <Spawn> 15.1.2005, 17:27
Так же как и в любом языке программирования, я думаю, т.е. читаешь некий большой файл нужными тебе блоками и пишешь все это в файлики нужного размера, дописывая, к примеру, к концу названия номер части. Обратным образом все пишешь в один файлsmile

Автор: maksar 15.1.2005, 17:29
1.открываеш файл ($fp=fopen)
2.сщитываеш кусками по $n байт($kusok = fread($fp, $n)
3. записываеш fwrite($fp, $kosok)

скреплятется в обратном порядке

Автор: IZ@TOP 15.1.2005, 22:09
Думаю что это будет выглядеть примерно следующим образом:
Код
<?php


function SplitFile($File, $Out, $Prefix = '%oldname.part-%i') {
$CheckSum = md5_file($File);
$Size  = filesize($File);
$BlockSize = round($Size / $Out);
$_fh_infile = fopen($File, "rb") or die('Cannot open file');
$i = 1;
while(!feof($_fh_infile)) {
 $NextBlock  = fread($_fh_infile, $BlockSize);
 $NextFile  = str_replace(array('%i', '%oldname'), array($i, $File), $Prefix).'.sf';
 $_fh_outfile = fopen($NextFile, "wb") or die('Cannot create new file');
 fputs($_fh_outfile, $NextBlock) or die('Cannot write to out file');
 fclose($_fh_outfile);
 $i++;
}
fclose($_fh_infile);
$_fh_checkfile = fopen($File.'.md5', "w");
fputs($_fh_checkfile, $CheckSum);
}

function MergeFile($Param, $OutFile, $CheckFile, $AutoSearch, $Ext = 'sf') {
if($AutoSearch) {
 $_fh_dir = opendir($Param);
 while($ar = readdir($_fh_dir)) {
  if(preg_match("%^.*\.$Ext$%ui", $ar)) $Files[] = $Param.'/'.$ar;
 }
} else {
 $Files = $Param;
}
asort($Files);
$_fh_outfile = fopen($OutFile, "wb") or die('Cannot crete out file');
while($NextFile = array_shift($Files)) {
 $_fh_infile = fopen($NextFile, "rb");
 fputs($_fh_outfile, fread($_fh_infile, filesize($NextFile))) or die('Cannot write to out file');
 fclose($_fh_infile);
}
fclose($_fh_outfile);

$CheckSum = implode('', file($CheckFile));
if($CheckSum != md5_file($OutFile)) {
 echo $CheckSum.'<br>'.md5_file($OutFile);
 die('Merge file failed');
 unlink($OutFile);
}
}

/* Example split file:
SplitFile('file.mp3', 5);

Example merge file:
MergeFile('.', 'new-file.mp3', 'file.mp3.md5', true);
*/

?>

Автор: Borland_Delphi_6 16.1.2005, 18:18
Спасибо, отлично работает! Но как бы сделать так, чтобы файл любого размера разбивался на куски по 200 кб?

Автор: IZ@TOP 17.1.2005, 01:48
Borland_Delphi_6, думаю что ты можешь это сообразить и без меня smile

Но вот тебе путь к разгадке:

Код

function SplitFile($File, $Out, $Prefix = '%oldname.part-%i') {
// ...
   $BlockSize = $Out;
// ...
}

SplitPage('file.mp3', (200*1024));


Думаю что тут понятно что происходит.
Добавлено @ 01:49
Borland_Delphi_6, кстате, вот тебе еще задание, там идет сортировка, но если кусков более 10, то части идут таким образом:
file-1
file-10
file-2

Попробуй с этим что-то сделать.

Автор: Borland_Delphi_6 17.1.2005, 16:05
Круто, мне уже модератор задание дает! smile Ладно, поглядим, попробуем, спасибки! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)