19. oktober 2006 - 15:58
#2
jeg ser lidt på Tar_by_Vladson, men det næste link virker ikke
en anden ting.. hvor mange formater kan man gemme lagre sine filer og mapper i? jeg tænker på tar, zip osv
19. oktober 2006 - 21:35
#5
Jeg har nu siddet hele dagen og forsøgt at omskrive scriptet, så jeg selv kan forstå hvad det helt præcist er der sker. For er ikke meget for bare at anvende et copy/paste script. Får man jo ikke særlig meget ud af :)
Jeg er kommet frem til at tar filer er opdelt i hele blokke (512bytes).. korrekt? :)
Jeg forstår for så vidt hvad der sker i mine funktioner backup() og file_list(), men hvad der sker i header_block() er jeg lidt i tvivl om
Det jeg så er lidt i tvivl om er:
sprintf('%6s ', decoct($info['mode']))
ord(substr($header, $i, 1))
Her er mit omskrevne script:
<?
function backup($tar_file = '../backup.tar')
{
$fp = fopen($tar_file, 'wb');
foreach(file_list() as $pathfile)
{
if(substr($pathfile, -1, 1) == '/') fwrite($fp, header_block($pathfile));
else
{
$filesize = filesize($pathfile);
$block_len = 512 * ceil($filesize / 512) - $filesize;
fwrite($fp, header_block($pathfile));
fwrite($fp, file_get_contents($pathfile));
fwrite($fp, pack('a'.$block_len, ''));
}
}
fwrite($fp, pack('a512', ''));
fclose($fp);
}
function file_list($dir = '.')
{
$handle = opendir($dir);
while(false !== ($readdir = readdir($handle)))
{
if($readdir != '.' && $readdir != '..')
{
$path = $dir.'/'.$readdir;
if(is_dir($path))
{
$file_arr[] = substr($path, 2, strlen($path)).'/';
$file_arr = array_merge($file_arr, file_list($path));
}
else $file_arr[] = substr($path, 2, strlen($path));
}
}
closedir($handle);
return $file_arr;
}
function header_block($pathfile)
{
if(strlen($pathfile) > 99 ) die('Error');
$info = stat($pathfile);
if(substr($pathfile, -1, 1) == '/') $info['size'] = 0;
$header = pack(
'a100a8a8a8a12A12a8a1a100a255',
$pathfile,
sprintf('%6s ', decoct($info['mode'])),
sprintf('%6s ', decoct($info['uid'])),
sprintf('%6s ', decoct($info['gid'])),
sprintf('%11s ', decoct($info['size'])),
sprintf('%11s', decoct($info['mtime'])),
sprintf('%8s', ' '),
(is_dir($pathfile) ? '5' : '0'),
'',
''
);
clearstatcache();
$checksum = 0;
for($i=0; $i<512; $i++) $checksum += ord(substr($header, $i, 1));
$checksum_data = pack(
'a8',
sprintf('%6s ', decoct($checksum))
);
for($i=0, $j=148; $i<7; $i++, $j++) $header[$j] = $checksum_data[$i];
return $header;
}
header('Content-type: text/plain');
$start_time = microtime();
backup();
$finish_time = microtime();
printf("The time taken: %f seconds", ($finish_time - $start_time));
?>