'; require ('../../config.php'); if(!function_exists('bzcompress')){ echo '请开启bz2服务'; exit(); } function file_list($source_dir,$target_dir){ $init_memory = memory_get_usage(); global $DB; if(function_exists('set_time_limit')){ set_time_limit(3000); } $i=1; $unsetcount=1; //没有下载到的案例 $file_in_str = ''; $file_out_str = ''; // 输出 字符串 $file_in_sequence = 101; $file_out_sequence = 102; //输出 序列号 $file_in_size = 0; if($handle = opendir($source_dir)){ // 打开路径 while(false !== ($file = readdir($handle))){//循环读取目录中的文件名并赋值给$file if($file != "." && $file != ".."){ //排除当前路径和前一路径 if(is_dir($source_dir.'/'.$file)){ //echo $source_dir.": ".$file."
";//去掉此行显示的是所有的非目录文件 file_list($source_dir.'/'.$file,$target_dir); // break 2;//只循环一个文件夹 }else{ // echo $source_dir . "/".$file."
"; $strNoName = strrev(strtok(strrev($source_dir), '/')); $inoutID = ltrim(substr($strNoName,0,4),0); $inoutFileName = substr($strNoName,4); if(strstr($file, 'in')){ $file_in_size = filesize($source_dir."/".$file) ;// 单个文件超过5m 则只转换 一个in和out } /**读文件部分 方法1-- 占用内存较少 效率低**/ $fp = fopen($source_dir."/".$file, "r"); $buffer = ''; if($fp){ while(!feof($fp)){ ob_flush(); $buffer = fgets($fp,2048);//2m if(strstr($file, 'in')){ $file_in_str .= $buffer;//输入的文件 } if(strstr($file, 'out')){ $file_out_str .= $buffer;//输出的文件 } flush(); } fclose($fp); if(!is_dir($target_dir.'/'.$strNoName)){ mkdir($target_dir.'/'.$strNoName, 0777); } if(!file_exists($target_dir.'/'.$strNoName.'/'.$file)){ copy($source_dir.'/'.$file,$target_dir.'/'.$strNoName.'/'.$file); //拷贝到新目录 unlink($source_dir.'/'.$file); //删除旧目录下的文件 if(!isEmptyDir($source_dir)){ rmdir($source_dir); //删除空的目录 } } } unset($buffer); if(strstr($file, 'in')){ $file_in_sequence = str_replace($inoutFileName, "", $file); $file_in_sequence = str_replace(".in", '', $file_in_sequence); $file_in_str = str_replace("\r","",$file_in_str); $file_in_str = str_replace("\n\n","",$file_in_str); } if(strstr($file, 'out')){ $file_out_sequence = str_replace($inoutFileName, "", $file); $file_out_sequence = str_replace(".out", '', $file_out_sequence); $file_out_str = str_replace("\r","",$file_out_str); $file_out_str = str_replace("\n\n","",$file_out_str); } } } // 处理,入库 $sql = ''; while($file_in_sequence==$file_out_sequence & !empty($file_in_sequence)){ if($unsetcount>30){//此变量,必须为---偶数--- 每次不宜超过20个<有一些文件比较大,输入比较耗时> redirectPage($init_memory); } else if(empty($inoutFileName) || empty($inoutID)){ $unsetcount++; break 1; } $sql = "select name from {study_data_test} where in_out='$inoutFileName' and nob='$inoutID' "; $programmingName = $DB->get_field_sql($sql); if(!$programmingName){ $unsetcount++; break 1; } $programmingName = str_replace('] ', ']', $programmingName); $sql = "select * from {programming} where name=? "; $programming = $DB->get_record_sql($sql,array($programmingName)); if(!$programming){ $unsetcount++; break 1; } //判断该 测试案例是否存在 $sql = "select * from {programming_tests} where programmingid=$programming->id and seq='$file_in_sequence'"; $caseMsg = $DB->get_record_sql($sql); if ($caseMsg) { echo '当前课程--'.$programmingName .'--'.$programming->id."--$file_in_sequence 已存在*****删除后,重新添加
"; /** unset($file_in_str);unset($file_out_str); $file_in_str = '';$file_out_str = ''; // 输出 字符串 $unsetcount++; if($file_in_size>1024*1024*4){ redirectPage(); } break 1;**/ $DB->delete_records('programming_tests',array('id'=>$caseMsg->id)); } $testcase = array(); $testcase['programmingid'] = (int)$programming->id; // 这3个,在数据库里面读 $testcase['timelimit'] = (int)$programming->timelimit; $testcase['memlimit'] = (int)ceil($programming->memlimit/1024); $testcase['seq'] = $file_in_sequence; $testcase['input'] = $file_in_str; $testcase['output'] = $file_out_str; if (strlen($testcase['input']) > 1024) { $testcase['gzinput'] = bzcompress($testcase['input']); $testcase['input'] = mb_substr($testcase['input'], 0, 1024, 'UTF-8'); }else{ $testcase['gzinput'] = null; } if (strlen($testcase['output']) > 1024) { $testcase['gzoutput'] = bzcompress($testcase['output']); $testcase['output'] = mb_substr($testcase['output'], 0, 1024, 'UTF-8'); }else{ $testcase['gzoutput'] = null; } $testcase['cmdargs'] = NULL; $testcase['nproc'] =0; $testcase['pub'] = 1; $testcase['weight'] = 1; $testcase['memo'] = ''; $testcase['timemodified'] = time(); echo '当前课程--'.$programmingName ."--$file_in_sequence--"; $cmid = $DB->insert_record('programming_tests',$testcase); echo $cmid . '
'; unset($file_in_str);unset($file_out_str);unset($testcase); //处理完成后,重置初始参数 $file_in_str = ''; $file_out_str = ''; // 输出 字符串 $file_in_sequence = 101; $file_out_sequence = 102; //输出 序列号 if($file_in_size> 1024*1024*4 ){// 单个文件超过3m 则只转换 一个in和out redirectPage($init_memory); } } $i++; if($i>30){ //此变量,必须为---偶数--- 每次不宜超过20个<有一些文件比较大,输入比较耗时> redirectPage($init_memory); } } } } $source_dir = "/www/ftpold"; $target_dir = "/www/ftp"; file_list($source_dir,$target_dir); function isEmptyDir( $path ) { $dh= opendir( $path ); while(false !== ($f = readdir($dh))) { if($f != "." && $f != ".." ) return true; } return false; } function redirectPage($init_memory){ $page = 'course_testcase.php?asf='. rand(1, 999); echo '3秒后跳转到下一页,如果没有跳转点击这里'; $final_memory = memory_get_usage(); $final_memory = ceil(($final_memory - $init_memory)/1024); echo '
当前使用的内存是:

'.$final_memory.' kb

'; echo ''; exit(); } ?>