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 に答える