1

如果字符串会使文件大小大于 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;
        }
}

更新 请有人解释为什么文件大小总是相同的吗?谢谢

4

2 回答 2

1

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

于 2012-10-05T04:24:22.340 回答
0

这是我最终得到的结果,我想如果其他人迟到并摸不着头脑,我会分享它。

我想出了为什么在循环中filesize()不更新(第一篇文章),你必须在每次使用之前调用。$sizeclearstatcache()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>");

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

于 2012-10-05T06:41:59.643 回答