LINUX.ORG.RU

Как скопировать один файл в определённое место другого?


1

1

Есть файлы A, B. Я хочу скопировать A в файл B по смещению X. То есть, в итоге я хочу иметь файл, который до смещения X выглядит как B, потом идёт файл A, а со смещения X+size(A) снова выглядит как B.


Ответ на: комментарий от AITap

А можно пример? Я пробовал через seek, но ничего не вышло. Оригинальный B был стёрт, а вместо него появился файл, который до адреса X состоит из нулей, потом идёт A и всё.

meduza
() автор топика
Ответ на: комментарий от meduza

Выше же советовали man dd почитать!

dd if=file1 of=file2 bs=<размер блока> count=<кол-во блоков> seek=<кол-во блоков смещения в выходном файле> skip=<кол-во блоков смещения во входном файле>

Eddy_Em ☆☆☆☆☆
()

Я бы написал короткую C или Java программку. Имхо, так проще.

observer ★★★
()

Для поставленной задачи что-то вроде такого:

dd if=B of=tmp1 bs=1b skip=X
dd if=B of=tmp0 bs=1b count=X
cat tmp0 A tmp1 > B
rm -f tmp0 tmp1

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от meduza

значит неправильно открыли. flags какие были в open() ? и да, ЕМНИП lseek правильные вызов.

а так вообще-то проще через dd:

dd if=A of=B seek=X count=размер_A obs=1 conv=notrunc

я проверил -это точно работает!

mumpster ★★★★★
()
#!/bin/bash
A=$1
B=$2
X=$3
split -a 1 -l $X $B tmp
cat tmpa $A tmpb > $B
rm -f tmpa tmpb
$ cat file1
123
234
345
456
$ cat file2
098
987
876
765
$ bash test.sh file1 file2 2
$ cat file2
098
987
123
234
345
456
876
765
shell-script ★★★★★
()

разреж по смещению, добавь че нужно catом и склей, делов-то.

IPR ★★★★★
()
$ echo abcdefghijklmnopqrstuvwxyz >a
$ echo -n 1234567890 >b
$ dd if=b of=a bs=1 seek=10 conv=notrunc
10+0 records in
10+0 records out
10 bytes (10 B) copied, 0,00018648 s, 53,6 kB/s
$ cat a
abcdefghij1234567890uvwxyz
$ _
arsi ★★★★★
()
Ответ на: комментарий от anonymous

А во фряхе можно split использовать или dd.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от arsi

лучше obs - пусть входнйо файл быстрее начитается

mumpster ★★★★★
()
Ответ на: комментарий от anonymous

это gnu-расширения; соотв. может и трудно

1. я на linux.org.ru пишу. А не на винфак или андроидфак. Потому мои советы по дефолту относятся таки к линуксу...

2. вообще говоря, ЯП не задан, потому ответить довольно сложно, да и вообще, тут 100500 решений может быть даже на любом конкретном ЯП.

drBatty ★★
()

Пришло время сдавать лабы! Лабы сами не сдадутся... Думаю С++ покатит:

int offset = ...;

FILE *fa = fopen("File_A_name", "rb");
FILE *fb = fopen("File_B_name", "r+b");

fseek(fa, 0, 2);
int fa_size = ftell(fa);
fseek(fa, 0, 0);

char *buffer = new char[fa_size];
fread(buffer, fa_size, 1, fa);

fseek(fb, offset, 0);
fwrite(buffer, fa_size, 1, fb);

fclose(fa);
fclose(fb);
delete [] buffer;
segfault ★★★★★
()
Ответ на: комментарий от segfault

нет уж - сказал А - говори и Б. ты сказал, ты и помогай с обработкой ошибок и прочая! и да, а чт не так с ЖЫРОМ, там уже не будет работать fopen?8)

mumpster ★★★★★
()
Ответ на: комментарий от segfault

over 9000

IMHO любая прога которая работает с файлами должна уметь либо учитывать их размеры и читать и писать учётом разумных ограничений на память либо проверять наибольший размер и выдавать ошибку если тот over 9000.

mumpster ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.