Я должен заменить на веб-сервере Linux первые 128 байтов некоторых двоичных файлов.
Файлы имеют размер ~ 5 Гб, и мне просто нужно переписать байты заголовка. Каков наилучший подход для этого с использованием собственных команд Linux или даже PHP?
dd
это простой подход.
dd if=128bytefile of=videofiletofix.mkv bs=128 count=1 conv=notrunc
Таким образом, это займет первые 128 байтов файла с именем 128bytefile
и перезапишет первые 128 байтов файла с именем videofiletofix.mkv
.
Параметр bs
говорит, что нужно копировать 128 байтов за раз, а параметр count
говорит, что нужно скопировать один такой 128-байтовый блок. Параметр conv=notrunc
важен - без него dd
будет обрезать выходной файл до длины скопированных данных (здесь 128 байт), что совершенно точно не то, что вам нужно.
Просто откройте файл в "append" или аналогичном режиме, найдите позицию 0, затем запишите свои данные.
"Собственные команды Linux": системные вызовы (или их оболочки libc) настолько близки, насколько это возможно.
#include <fcntl.h> #include <unistd.h> void main() { char buf[128] = "this and that"; int fd = open("file", O_WRONLY); lseek(fd, 0, SEEK_SET); write(fd, &buf, sizeof(buf)); close(fd); }
PHP:
<?php $buf = "this and that"; $fh = fopen("file","a""r+"); fseek($fh, 0); fwrite($fh, $buf); fclose($fh);