Есть ли способ эффективно добавлять файлы с помощью команды копирования DOS?

58071
clsturgeon

Использование синтаксиса команды копирования DOS для объединения файлов:

copy file1.txt+file2.txt all.txt 

Я знаю, что я могу сделать это...

copy file1.txt+file2.txt file1.txt 

Это эффективно? Это делает то, что я ожидаю? Это работает, но я хочу знать, действительно ли он добавляет файл file1.txt или копирует file1.txt (плохо), объединяет file2 и затем переименовывает в file1.txt (что неэффективно)?

5
В качестве примечания, помните, что вам нужно использовать ключ "/ b", если вы когда-нибудь решите использовать бинарные файлы copy to cat. Brian Knoblauch 13 лет назад 2
Никто здесь, кажется, не думает, что дело "огромных файлов" стоит рассмотреть или дать решение. Milind R 9 лет назад 1

3 ответа на вопрос

9
Tyler

copyявляется копирование file1.txtи file2.txtв памяти, конкатенации их затем выписывая в file1.txt. Это не копирование в новый файл, а затем переименование этого файла, так что на самом деле не так много дополнительного дискового ввода-вывода.

Вы также можете использовать type.

type file2.txt >> file1.txt 

>>Оператор добавляет текст. Но это, конечно, не будет работать для двоичных файлов.

это должно хорошо работать для двоичных файлов. это просто обычно не полезно, потому что большинство форматов двоичных данных используют некоторую форму инкапсуляции, так что даже в объединенном файле будет распознаваться и использоваться только первый файл. скажем, если бы у вас было 2 необработанных файла PCM, это был бы хороший способ объединить их (в отличие от 2 файлов WAV, где для изменения заголовков необходима другая программа). quack quixote 14 лет назад 3
Я использовал термин переименование очень свободно. Если file1 и file2 - это огромные файлы, я хочу, чтобы file2 добавлялся в file1 БЕЗ копирования каких-либо данных file1 (он слишком большой для повторного копирования). Тайлер, ты предположил, что он скопирует данные file1.txt. Используя команду типа, это на самом деле добавится? Благодарю. clsturgeon 14 лет назад 1
Имейте в виду, что старые версии DOS не смогли скопировать цель в цель с источником копирования + источником другого файла. В результате был получен исходный файл размером 64 КБ, поскольку для чтения и записи использовался буфер размером 64 КБ, а после первого сброса исходный код был размером всего 64 КБ :-). TheBlastOne 12 лет назад 0
*> copy копирует ... в память, объединяет их и записывает в file1.txt. Это не копирование в новый файл, а затем переименование этого файла, так что на самом деле не так много дополнительного дискового ввода-вывода. * Это может быть верно для крошечных файлов, но определенно не верно для файлов любого значительного размера. Что делать, если два файла огромны? Сделайте тест, и вы заметите, что использование памяти ** не ** увеличивается во время перенаправления. Поэтому он не объединяет их в памяти. И, конечно, он не может объединить их два исходных файла, так как он еще не прочитал их, поэтому он * использует * временный файл / канал. Synetech 11 лет назад 1
2
Synetech

Is this efficient?

Sure. However, using the the /b switch can/may increase performance by simply concatenating the bytes instead of processing the files as text. This is particularly noticeable when concatenating very large text files.

Is it doing what I'm expecting?

Usually yes, but if the file was made in Linux, Mac, or other system with differing file-/line-terminators, then it may give unexpected results. It is a good idea to use the /b switch in general, even for text files.

I want to know is it actually appending to file1.txt or is it copying file1.txt (bad), concatenating file2 and then renaming to file1.txt (which is not efficient)?

Yes, it is creating a new, temporary file, deleting the original, and renaming the temp file to the original name, but deleting and renaming take no time and unless the original file is massive, you won’t normally notice even the (redundant) copying of the original file.

0
Wilson

Если они имеют одинаковое расширение, вы можете сделать это -

тип *.txt >> fileout.tmp.

Затем переименуйте fileout.tmpв правильное расширение.