当文件达到一定大小时,将数据添加到新文件

时间:2012-10-05 04:20:34

标签: php createfile

如果字符串使文件大小超过1 MB并在需要第4个文件时中断循环,我将如何停止写入文件并创建新文件。

$max_size = 1048576; // 1 MB
$max_files = 3;
$i = 1;
$loop = true;
$size = 0;
$x = 0;

while($loop)
{
        $str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n";

        $file = 'C:\xampplite\htdocs\moo\file_'.$i.'.tmp';

        if(file_exists($file))
        {
                $size = filesize($file);
                echo 'File exists with size: '.$size.'<br>';
        }
        else
        {
                $size = 0;
                echo 'No file exists, size: '.$size.'<br>';
        }


        $fh = @fopen($file, 'a');

        if( ! $fh)
        {
                echo 'Failed to write to temp file "'.$file.'".';
        } 

        fwrite($fh, $str);  
        fclose($fh);

        $x++;

        if($x == 100)
        {
            break;
        }
}

更新 请问有人能解释为什么文件大小总是一样的吗? 感谢

2 个答案:

答案 0 :(得分:1)

跟踪您要写出的数据量。在进行写入之前,请将文本的长度添加到已经写出的长度。如果达到限制,则递增i,重置写出的字节数,然后继续。如果您要写入现有文件,请使用filesize().

获取文件大小

答案 1 :(得分:0)

以下是我最终的结果,如果其他任何人迟到并且摸不着头脑,我想我会分享它。

我弄清楚为什么filesize()在循环(第一篇文章)中不会更新$size,您必须在每个clearstatcache()使用之前调用filesize()

PHP手册filesize()
注意:缓存此函数的结果。有关详细信息,请参阅clearstatcache()

$start = microtime(true);
$max_size = 1048576; // 1 MB
$max_files = 3;
$file_num = 1;
$size = 0;
$lines = 0;
$total_lines = 0;

while(true)
{                    
        $file = '/path/to/file_'.$file_num.'.tmp';            
        $str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\n";

        if($lines === 0)
        {
                if(file_exists($file))
                {
                        clearstatcache();
                        $size = filesize($file);
                        print("<pre>" . print_r('File exists with size = '.$size, true). "</pre>");
                }
                else
                {
                        $size = 0;
                        print("<pre>" . print_r('No file exists, size = '.$size, true). "</pre>");

                }
        }

        // add string length to size
        $size = ($size + strlen($str));

        if($size > $max_size)
        {
                print("<pre>" . print_r('Max file size exceeded for file '.$file_num.'. Total lines written '.$lines, true). "</pre>");
                $file_num++;
                $lines = 0;

                // escape loop after creating 3 files
                if($file_num > $max_files)
                {
                        break;
                }

                continue;
        }

        $lines++;
        $total_lines++;

        $fh = @fopen($file, 'a');

        if( ! $fh)
        {
                echo 'Failed to write to temp file "'.$file.'".';
        } 

        fwrite($fh, $str);
        //print("<pre>" . print_r('Writing to file: '.$file, true). "</pre>");
        fclose($fh);    
}

$end = microtime(true);

$time = $end - $start;
print("<pre>" . print_r('------------------------------------------------------------', true). "</pre>");
print("<pre>" . print_r('Total time: '.$time.' seconds.', true). "</pre>");
print("<pre>" . print_r('Total lines: '.$total_lines, true). "</pre>");

希望这对任何人都有帮助。