Разделение большого текстового документа на несколько небольших текстовых файлов

Я разрабатываю механизм сбора текста, использующий fwrite()для записи текста, но я хочу поставить крышку размера файла 1,5 Мб на процесс записи, так что если файл больше, что 1,5 мб он начнет писать новый файл с того места, где он остановился, и так далее, пока он записывает содержимое исходного файла в несколько файлов. Я искал Google, но многие учебники и примеры слишком сложны для меня, потому что я начинающий программист. Код ниже находится внутри forцикла, который извлекает текст ($RemoveTwo). Он не работает так, как мне нужно. Любая помощь будет оценена.

        switch ($FileSizeCounter) {
            case ($FileSizeCounter> 1500000):
                 $myFile2 = 'C:TextCollector/'.'FilenameA'.'.txt';
                 $fh2 = fopen($myFile2, 'a') or die("can't open file");
                    fwrite($fh2, $RemoveTwo);
                    fclose($fh2);  
                break;
            case ($FileSizeCounter> 3000000):
                 $myFile3 = 'C:TextCollector/'.'FilenameB'.'.txt';
                 $fh3 = fopen($myFile3, 'a') or die("can't open file");
                    fwrite($fh3, $RemoveTwo);
                    fclose($fh3);  
                break;
            default:
                echo "continue and continue until it stops by the user";
        }

1 ответ

  1. Попробуйте сделать что-то подобное. Вам нужно читать из источника, а затем писать по частям все время, проверяя конец файла из источника. Если вы сравниваете значения max и buffertrue, то закройте текущий файл и откройте новый файл с автоматически увеличенным числом:

    /*
    ** @param $filename [string] This is the source
    ** @param $toFile [string] This is the base name for the destination file & path
    ** @param $chunk [num] This is the max file size based on MB so 1.5 is 1.5MB
    */
    function breakDownFile($filename,$toFile,$chunk = 1)
        {
            // Take the MB value and convert it into KB
            $chunk      =   ($chunk*1024);
            // Get the file size of the source, divide by kb
            $length     =   filesize($filename)/1024;
            // Put a max in bits
            $max        =   $chunk*1000;
            // Start value for naming the files incrementally
            $i          =   1;
            // Open *for reading* the source file
            $r          =   fopen($filename,'r');
            // Create a new file for writing, use the increment value
            $w          =   fopen($toFile.$i.'.txt','w');
            // Loop through the file as long as the file is readable
            while(!feof($r)) {
                // Read file but only to the max file size value set
                $buffer =   fread($r, $max);
                // Write to disk using buffer as a guide
                fwrite($w, $buffer);
                // Check the bit size of the buffer to see if it's
                // same or larger than limit
                if(strlen($buffer) >= $max) {
                    // Close the file
                    fclose($w);
                    // Add 1 to our $i file
                    $i++;
                    // Start a new file with the new name
                    $w  =   fopen($toFile.$i.'.txt','w');
               }
            }
            // When done the loop, close the writeable file
            fclose($w);
            // When done loop close readable
            fclose($r);
        }
    

    Использовать:

    breakDownFile(__DIR__.'/test.txt',__DIR__.'/tofile',1.5);