Projekt

Obecné

Profil

Stáhnout (3.31 KB) Statistiky
| Větev: | Tag: | Revize:
<?php defined('SYSPATH') or die('No direct script access.');
/**
* File helper class.
*
* $Id: file.php 1725 2008-01-17 16:38:59Z PugFish $
*
* @package File Helper
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class file {

/**
* Split a file into pieces matching a specific size.
*
* @param string file to be split
* @param string directory to output to, defaults to the same directory as the file
* @param integer size, in MB, for each chunk to be
* @return integer The number of pieces that were created.
*/
public static function split($filename, $output_dir = FALSE, $piece_size = 10)
{
// Find output dir
$output_dir = ($output_dir == FALSE) ? pathinfo(str_replace('\\', '/', realpath($filename)), PATHINFO_DIRNAME) : str_replace('\\', '/', realpath($output_dir));
$output_dir = rtrim($output_dir, '/').'/';

// Open files for writing
$input_file = fopen($filename, 'rb');

// Change the piece size to bytes
$piece_size = 1024 * 1024 * (int) $piece_size; // Size in bytes

// Set up reading variables
$read = 0; // Number of bytes read
$piece = 1; // Current piece
$chunk = 1024 * 8; // Chunk size to read

// Split the file
while ( ! feof($input_file))
{
// Open a new piece
$piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT);
$piece_open = @fopen($piece_name, 'wb+') or die('Could not write piece '.$piece_name);

// Fill the current piece
while ($read < $piece_size AND $data = fread($input_file, $chunk))
{
fwrite($piece_open, $data) or die('Could not write to open piece '.$piece_name);
$read += $chunk;
}

// Close the current piece
fclose($piece_open);

// Prepare to open a new piece
$read = 0;
$piece++;

// Make sure that piece is valid
($piece < 999) or die('Maximum of 999 pieces exceeded, try a larger piece size');
}

// Close input file
fclose($input_file);

// Returns the number of pieces that were created
return ($piece - 1);
}

/**
* Join a split file into a whole file.
*
* @param string split filename, without .000 extension
* @param string output filename, if different then an the filename
* @return integer The number of pieces that were joined.
*/
public static function join($filename, $output = FALSE)
{
if ($output == FALSE)
$output = $filename;

// Set up reading variables
$piece = 1; // Current piece
$chunk = 1024 * 8; // Chunk size to read

// Open output file
$output_file = @fopen($output, 'wb+') or die('Could not open output file '.$output);

// Read each piece
while ($piece_open = @fopen(($piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT)), 'rb'))
{
// Write the piece into the output file
while ( ! feof($piece_open))
{
fwrite($output_file, fread($piece_open, $chunk));
}

// Close the current piece
fclose($piece_open);

// Prepare for a new piece
$piece++;

// Make sure piece is valid
($piece < 999) or die('Maximum of 999 pieces exceeded');
}

// Close the output file
fclose($output_file);

// Return the number of pieces joined
return ($piece - 1);
}

public static function extension($filename)
{
$p = explode('.',$filename);
return strtolower($p[count($p)-1]);
}

} // End file
(16-16/41)