Есть ли способ эффективно добавлять файлы с помощью команды копирования DOS?
Использование синтаксиса команды копирования DOS для объединения файлов:
copy file1.txt+file2.txt all.txt
Я знаю, что я могу сделать это...
copy file1.txt+file2.txt file1.txt
Это эффективно? Это делает то, что я ожидаю? Это работает, но я хочу знать, действительно ли он добавляется в file1.txt или копирует file1.txt (плохо), объединяет file2 и затем переименовывает в file1.txt (что неэффективно)?
5 ответов
copy
копирует file1.txt
а также file2.txt
в память, объединяя их, затем записывая file1.txt
, Это не копирование в новый файл, а затем переименование этого файла, так что на самом деле не так много дополнительного дискового ввода-вывода.
Вы также можете использовать type
,
type file2.txt >> file1.txt
>>
Оператор добавляет текст. Но это, конечно, не будет работать для двоичных файлов.
Это эффективно?
Конечно. Однако, используя /b
Коммутатор может / может повысить производительность, просто объединяя байты вместо обработки файлов как текста. Это особенно заметно при объединении очень больших текстовых файлов.
Это делает то, что я ожидаю?
Обычно да, но если файл был создан в Linux, Mac или другой системе с различными разделителями файлов / строк, то он может дать неожиданные результаты. Это хорошая идея, чтобы использовать /b
в общем, даже для текстовых файлов.
Я хочу знать, действительно ли он добавляется в file1.txt или копирует file1.txt (плохо), объединяет file2 и затем переименовывает в file1.txt (что неэффективно)?
Да, он создает новый временный файл, удаляет исходный файл и переименовывает временный файл в исходное имя, но удаление и переименование не занимают много времени, и если исходный файл не имеет большого размера, вы обычно не заметите даже (избыточный) копирование оригинального файла.
Если они имеют одинаковое расширение, вы можете сделать это -
тип *.txt >> fileout.tmp
,
Тогда переименуй fileout.tmp
на правильное расширение.
Файлы представляют собой потоки, то есть они действительно работают как кассетная дека, которую вы можете мгновенно переместить куда угодно, но вам все равно придется «нажимать кнопку воспроизведения» и последовательно потреблять данные. Итак, вы можете сделать следующее:
- Переместите указатель поиска куда-нибудь между 0 и концом файла.
- Прочтите, где находится указатель поиска, перемещая указатель поиска вперед.
- Напишите, где находится указатель поиска, перемещая указатель поиска вперед. Если вы продолжаете идти дальше конца файла, вы увеличиваете его.
Вот и все. Ну и еще одно:
- Сообщите ОС, что указатель поиска — это новый конец файла. Это усечение, и все, что находится после конца, теряется.
Если вы хотите «удалить» что-то в середине или начале файла, вам придется переписать весь файл – начиная с конца и двигаясь к началу.
Итак, есть одна вещь, с которой традиционные файлы не справляются, — это сжатие с самого начала.
Таким образом, сложно сделать «эффективное» добавление, которое сжимает второй исходный файл при сшивании первого.
Это определенно возможно, но вам придется манипулировать структурами файловой системы, чтобы сделать это таким образом, чтобы это того стоило - структуры файловой системы - это специфичные для ОС и файловой системы вещи, которые вы не видите с помощью dir и File Exmplorer . Это означает, что каждая существующая файловая система — NTFS, FAT32, ext2 (Linux) — потребует для этого своего собственного метода.
Мне неизвестны какие-либо существующие утилиты «сшивания» Windows, которые позволяют объединять файлы, не имея места для третьего файла. Некоторые из них могут быть, если вы их найдете, будьте очень осторожны и тщательно проверяйте , поскольку по сути это манипулирование файлами нестандартным и небезопасным способом, и если утилита не будет работать на 100%, как рекламируется, вы потеряете данные!
Найти базовый каталог, в котором расположены файлы
-
dir /b /s *.xml > dirlist.txt
- редактировать каждую строку
dirlist.txt
используя копирование + замену, т.е. -
l:\dir1\dir2\file.xml
- заменять
l:\
с" m:\dest.txt<br>copy /b m:\dest.txt+"
- сохранить файл как
dirlist.htm
- открыть файл в браузере
- скопируйте результаты обратно в редактор
- исправьте первую и последнюю строки
- сохраните файл как
- откройте командную строку и запустите
.bat
файл
Результаты двоичной копии добавлены кm:\dest.txt
*Примечание: я помню, что старая MS-DOS внутренне взламывала файлы с одним и тем же источником и пунктами назначения (64 КБ). Для очень больших файловых продуктов безопаснее использовать временный файл. Если ОС не может справиться с задачей с использованием временного файла из-за ограничений внутреннего буфера или плохого кодирования, DOS не сможет выполнить задачу.
*Примечание. Для любого добавленного целевого файла размером около 1 ГБ я бы предложил скопировать все целевые файлы во временный каталог и выполнить коммит.copy /b *.*; target.file
.