PHP做文件分割,听着不难,实现起来就麻烦了。自己想方法,听起来显然不太现实,所以只有靠搜索,搜索时间是非常长的,历时好几天。开始找的一堆内容压根看不懂,以后找到一个有用的,也没看懂,之后文件函数看了一堆,看了一天才基本明白。这速度没戏啊。
代码是这样的:
fseek($fp,$l*$start);
$tmp_file=fread($fp,$l*($end-$start));
fclose($fp);
$new= fopen($new_file,'a+');
fwrite($new,$tmp_file);
fclose($new);
当然这是关键的几行,其中用了fopen,fseek,fread,fclose,fwrite五个函数,就是如此而已。如果弄清楚了这几个函数的用法,似乎是很简单。当然,写一个简单一次性分割还是可以的。
从昨天开始,简单的测试后,就开始写了,半天程序基本成型了。改啊改,终于差不多了。从最初的1.00被我一直修改到1.20,就两天,说快也快,不过有几处压根就不知道怎么去验证,比如该输入数字的地方输入了字母怎么办。
还有比较疑惑的就是密码问题,加入密码本来不是很麻烦的事,我设定了COOKIE,本来时间是有5天,可就是时不时出现要输入密码,这玩意头痛啊。后来知道是路径问题,就把文件名加到路径中,这可不好玩,因为这个做法是错误的。唉。
原本7行的代码,却一下子变成226行,程序就这样,不过我写的估计没人看得下去,你们可以想象,手机上写代码是什么状况,没有编辑器,你很难清楚突然冒出来的一个”}”是属于哪个if的,你不要指望会出现多少空格,除了偶尔在echo中输出某个参数时留个空格,很少有空格,所以这样的代码在电脑上一般很难认,除非你是作者,当然作者也有糊涂的时候。以前写注释,这点不错,原本以为这个程序不怎么大,没想到也有7K。如果加一堆注释那得了。当然,开始没准备写注释,后面也就没写。一个不在手机写这东西的人,很难想象超详细注释的作用,因为一丁点屏幕你看不到多少字母,所以……
例子一个https://sourceforge.net/projects/my-php/files/File-Splitter/(66月29更新)
哦,在手机上写代码?你还不如直接在纸上写呢!
你在纸上面写怎么调试?
哈哈~在楼猪的时代,居然有66这个月份。位置在演示地址的后面。
另外就是,1.21.php这个文档里面的日期居然出现穿越(1.20更新:2012.06.29.17.56.46)。
还有就是,谢谢楼主哈~~ :mrgreen:
错误一直是不可避免的
话说博主那段代码好像没什么效率。。。
不如一个循环来得痛快 8-O
请你先考虑以个问题,我写这个的动机和目的,如果一个循环解决了,那么手机下载有会有一个等待过程,我要尽可能长时间把人留住,让手机慢下来,以前用得太快,受报应了的
这么说也对
如果真的有需要,一个循环有不难,会的人稍微修改一下就好
:mrgreen: 佩服啊
写代码的 都是牛人啊
:wink:
function split_go() {
global $list, $options;
for($i = 0; $i < count ( $_POST ["files"] ); $i ++) {
$split_ok = true;
$file = $list [$_POST ["files"] [$i]];
$partSize = round ( ($_POST ["partSize"] [$i]) * 1024 * 1024 );
$saveTo = ($options['download_dir_is_changeable'] ? stripslashes ( $_POST ["saveTo"] [$i] ) : realpath ( $options['download_dir'] )) . '/';
$dest_name = basename ( $file ["name"] );
$fileSize = filesize ( $file ["name"] );
$totalParts = ceil ( $fileSize / $partSize );
$crc = ($_POST ['crc_mode'] [$i] == 'file_read') ? dechex ( crc32 ( read_file ( $file ["name"] ) ) ) : (($_POST ['crc_mode'] [$i] == 'hash_file' && function_exists ( 'hash_file' )) ? hash_file ( 'crc32b', $file ["name"] ) : '111111');
$crc = str_repeat ( "0", 8 – strlen ( $crc ) ) . strtoupper ( $crc );
echo "Started to split file ” . basename ( $file [“name”] ) . “ parts of ” . bytesToKbOrMbOrGb ( $partSize ) . “, Using Method – Total Commander…”;
echo “Total Parts: ” . $totalParts . ““;
for($j = 1; $j <= $totalParts; $j ++) {
if (file_exists ( $saveTo . $dest_name . '.' . sprintf ( "%03d", $j ) )) {
echo "It is not possible to split the file. A piece already exists” . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) . “ !”;
continue 2;
}
}
if (file_exists ( $saveTo . $dest_name . ‘.crc’ )) {
echo “It is not possible to split the file. CRC file already exists” . $dest_name . ‘.crc’ . “ !”;
} elseif (! is_file ( $file [“name”] )) {
echo “It is not possible to split the file. Source file not found” . $file [“name”] . “ !”;
} elseif (! is_dir ( $saveTo )) {
echo “It is not possible to split the file. Directory doesn’t exist” . $saveTo . “ !”;
} elseif (! @write_file ( $saveTo . $dest_name . “.crc”, “filename=” . $dest_name . “\r\n” . “size=” . $fileSize . “\r\n” . “crc32=” . $crc . “\r\n” )) {
echo “It is not possible to split the file. CRC Error” . $dest_name . “.crc” . “ !”;
} else {
$time = filemtime ( $saveTo . $dest_name . ‘.crc’ );
while ( isset ( $list [$time] ) ) {
$time ++;
}
$list [$time] = array (“name” => $saveTo . $dest_name . ‘.crc’, “size” => bytesToKbOrMbOrGb ( filesize ( $saveTo . $dest_name . ‘.crc’ ) ), “date” => $time );
$split_buffer_size = 2 * 1024 * 1024;
$split_source = @fopen ( $file [“name”], “rb” );
if (! $split_source) {
echo “It is not possible to open source file ” . $file [“name”] . “ !”;
continue;
}
for($j = 1; $j <= $totalParts; $j ++) {
$split_dest = @fopen ( $saveTo . $dest_name . '.' . sprintf ( "%03d", $j ), "wb" );
if (! $split_dest) {
echo "Error openning file ” . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) . “ !”;
$split_ok = false;
break;
}
$split_write_times = floor ( $partSize / $split_buffer_size );
for($k = 0; $k < $split_write_times; $k ++) {
$split_buffer = fread ( $split_source, $split_buffer_size );
if (fwrite ( $split_dest, $split_buffer ) === false) {
echo "Error writing the file ” . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) . “ !”;
$split_ok = false;
break;
}
}
$split_rest = $partSize – ($split_write_times * $split_buffer_size);
if ($split_ok && $split_rest > 0) {
$split_buffer = fread ( $split_source, $split_rest );
if (fwrite ( $split_dest, $split_buffer ) === false) {
echo “Error writing the file ” . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) . “ !”;
$split_ok = false;
}
}
fclose ( $split_dest );
if ($split_ok) {
$time = filemtime ( $saveTo . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) );
while ( isset ( $list [$time] ) ) {
$time ++;
}
$list [$time] = array (“name” => $saveTo . $dest_name . ‘.’ . sprintf ( “%03d”, $j ), “size” => bytesToKbOrMbOrGb ( filesize ( $saveTo . $dest_name . ‘.’ . sprintf ( “%03d”, $j ) ) ), “date” => $time );
}
}
fclose ( $split_source );
if ($split_ok) {
if ($_POST[“del_ok”] && !$options[‘disable_deleting’]) {
if (@unlink ( $file [“name”] )) {
unset ( $list [$_POST [“files”] [$i]] );
echo “Source file deleted.”;
} else {
echo “Source file isnot deleted!“;
}
}
}
if (! updateListInFile ( $list )) {
echo “Couldn’t update file list. Problem writing to file!”;
}
}
}
}
无意间找到这个函数
函数没怎么看懂,还有些函数不认识
我也找了若干天了,今天找到你了,你的代码我看的迷迷糊糊的…
可以先找个格式化工具,然后再看,手机写的代码就这样,能写出来就算奇迹了。当然你可以先测试下代码。
:twisted: 神马?楼猪居然用手机写的!太牛B了!
是的,手机写的。纯文本编辑,没什么代码高亮的
手机写代码需要相当的勇气
是啊,有有