PHP在不重写文件的情况下将数据写入文件中间的最佳方法是什么

标签 php file

我正在使用 php (1GB+) 处理大型文本文件,我正在使用

file_get_contents("file.txt", NULL, NULL, 100000000,100); 

要从文件中间获取数据,但如果我想将文件中的数据更改为与原始数据不同的内容,我将不得不重写整个文件。

如果数据大于原始数据,如何在不覆盖数据的情况下更改文件(可变长度)中的数据?我保留了文件中不同数据 block 的索引及其字节位置。似乎唯一的选择是为每条数据分配 x 个字节,然后在我想更改它时重写该 block ……问题是它会占用比所需空间更多的空间空字节,并且写入需要更长的时间...并且仍然无法解决如何“删除”数据的问题,因为文件的大小永远不会缩小...我真的需要一些帮助...

如果我为文件中的每条数据使用前缀 block ,比如 1 mb,那么我想输入只有 100kb 的数据,该条目将占用 10 倍的实际需要的空间,并且条目永远不能更改为超过 1mb 的数据,因为它会覆盖超过第一个专用 block ...删除它是不可能的...希望这有任何意义...我不是在寻找替代方案,我我想在文件中间写入和更改数据,呵呵...

更新:是的,我想替换旧数据,但如果新数据比旧数据扩展更多,我希望将其余数据进一步插入文件...

考虑这个:0000000HELLODATA00000000 零代表空白,什么都没有......现在我想用一些东西替换你好,现在因为一些东西比你好,简单地写在你好的起点会延伸到你好并开始覆盖数据......所以我会比如数据被进一步插入文件,为一些东西腾出空间而不覆盖数据......呵呵

最佳答案

覆盖数据:

$fp = fopen("file.txt", "rw+");
fseek($fp, 100000000); // move to the position
fwrite($fp, $string, 100); // Overwrite the data in this position 
fclose($fp);

注入(inject)数据

这很棘手,因为您必须重写 文件。可以通过注入(inject)点部分修改而不是整个文件

对其进行优化
$string = "###INJECT THIS DATA ##### \n";
injectData("file.txt", $string, 100000000);

使用的函数

function injectData($file, $data, $position) {
    $fpFile = fopen($file, "rw+");
    $fpTemp = fopen('php://temp', "rw+");

    $len = stream_copy_to_stream($fpFile, $fpTemp); // make a copy

    fseek($fpFile, $position); // move to the position
    fseek($fpTemp, $position); // move to the position

    fwrite($fpFile, $data); // Add the data

    stream_copy_to_stream($fpTemp, $fpFile); // @Jack

    fclose($fpFile); // close file
    fclose($fpTemp); // close tmp
}

关于PHP在不重写文件的情况下将数据写入文件中间的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16813457/

相关文章:

php - Sublime Text 导入 php 类有什么解决方案吗? Netbeans 上类似于 "Fast Import"的东西?

PHP 发送变量到 file_get_contents()

php - 有没有办法在 Blade 中缓存变量?

java - 在java中读取格式化的文本文件

R - 检查文件是否打开/关闭以及由哪个用户打开/关闭

javascript - 使用 HTML 将文件上传到 Node.js

php - 在 PHP 5.2.x 中使用 Docker 环境变量

php - Laravel 在 Controller 中划分并在 Blade 中显示

html - 样式输入类型文件?

C I/O 程序不工作