С копирование файла с заменой
Иногда приходится сталкиваться с неожиданными трудностями при довольно несложной операции перезаписи файла. Ниже подробно описано несколько правильных вариантов последовательности действий при замене файла.
Если нужно переписать обычный файл, не являющийся частью операционной системы, то это можно сделать таким образом. Сначала откройте стандартный проводник Windows нажатием сочетания клавиш CTRL + E либо двойным щелчком на иконке «Мой компьютер».
По дереву папок в левой панели перейдите к месту хранения вашего нового файла, выделите его и скопируйте в оперативную память. Сделать это можно нажав сочетание клавиш CTRL + C, либо щелкнув файл правой кнопки мыши и выбрав в контекстном меню соответствующий пункт.
После этого по дереву папок в левой панели проводника перейдите к месту хранения файла, который нужно переписать. Если место его хранения неизвестно, то в главном меню (на кнопке «Пуск») в разделе «Найти» выберите «Файлы и папки», в открывшемся окне поиска наберите названия нужного файла и нажмите «Найти».
Когда файл будет найден с использованием поискового диалога либо в проводнике, выделите его и вставьте содержащийся в оперативной памяти файл замены. Можно сделать это, нажав сочетание клавиш CTRL + V или щелкнув правой кнопки мыши и выбрав соответствующий пункт в контекстном меню.
Если же надо переписать системный файл из состава действующей операционной системы, то вам нужно действовать в немного другой последовательности. Но сначала, как и в предыдущем варианте, сочетанием клавиш CTRL + E, либо двойным щелчком по иконке «Мой компьютер» откройте проводник Windows.
По дереву папок в левой панели проводника перейдите к месту хранения вашего нового файла, выделите его и скопируйте в память, как это было описано в предыдущем способе.
Как и в случае с несистемным файлом по дереву папок в левой панели перейдите к файлу, который надо заменить, либо найдите его, воспользовавшись поисковым диалогом «Файлы и папки» из раздела «Найти» главного меню (на кнопке «Пуск»).
Найденный в проводнике или в поисковом диалоге файл щелкните правой кнопкой мыши и в контекстном меню выберите пункт «Свойства». В окошке свойств файла на вкладке «Безопасность» нажмите кнопку «Дополнительно».
В открывшемся окне на вкладке «Владелец» в списке «Изменить владельца на» вам нужно выбрать строку своего логина. Затем нажатием кнопок «ОК» закройте оба открытых диалоговых окна.
После смены владельца вставьте файл из оперативной памяти нажатием сочетания клавиш CTRL + V или щелчком по файлу правой кнопкой мыши и выбором соответствующего пункта в контекстном меню.
И в данном посте я рассмотрю замену и копирование файлов через командную строку, а именно, утилиты COPY и REPLACE. Но сперва, как всегда немого лирики.
Пожалуй, любой программист сталкивался с вопросом написания функции для копирования каталога с файлами. Как правило, эти задачи решались при использовании рекурсии. В былые времена, не было мышки и правого клика со вкладкой «копировать, вырезать, вставить», да и синий Волков не сразу появился. Это теперь все так привычно, сидишь за клавиатурой, втыкаешь в зеленое поле Винды, клик туда, клик сюда, и все, задачу решил. Но, бывали и трудные ситуации, когда приходилось прибегать к синему менеджеру. Как не странно, но командная строка и ее утилиты от версии к версии меняют свой вид, Есть даже целый набор утилит типа PsUtils, которые эффективней стандартных ДОСовских. Логический вопрос, кому это все надо! Какой смысл изобретать современного динозавра, йоп те! С другой стороны, такова наша природа человеческая, мы готовы даже велосипед снова изобрести, лишь бы занять свой ум.
Командная строка xcopy
XCOPY источник [результат] [/A | /M] [/D[:дата]][/P] [/S [/E]] [/V]
[/X] [/Y] [/-Y] [/Z] [/EXCLUDE:файл1[+файл 2][+ файл 3]. ]
Источник – указываем путь к файлу (файлам), который нужно скопировать.
Результат – указываем место, куда нужно скопировать файл через командную строку. Если данный параметр отсутствует, то документы будут дублироваться в текущий каталог.
/V – как и в предшествующей версии, данный параметр отвечает за проверку телесности документов, но, уже не является обязательным, поскольку проверка осуществляется самой системой. Он остался лишь для совместимости с предыдущими версиями MS-DOS.
/EXCLUDE:файл1[+файл 2][+ файл 3]… – позволяет исключить несколько файлов или папок из процесса копирования. Тут все просто, надо только указать имена объектов, которые следует исключить, но, нельзя использовать спецсимволы, типа «*» и «?». Ключи файл1, файл2, … указывают на документы, в которых прописаны строки, каждая строка должна находится в отдельной линии. Если же хоть одна из строк будет совпадать с любой частью абсолютного пути копируемого документа, то скопировать с помощью командной строки данный файл не получится. Допустим в каталоге D:DATA есть три документа с расширением txt: data1.txt, data2.txt и data3.txt. Откроем CMD и пропишем в ней следующие команды:
echo data1.txt>exclude.txt
echo data2.txt>>exclude.txt
В данном примере мы создали в текущем каталоге текстовый документ exlude.txt, в котором прописаны две строчки data1.txt и data2.txt. Символ «>>» отличается от символа «>» только тем, что дописывает данные в конец документа, а не затирает все содержимое новой информацией. Ладно, теперь попробуем выполнить следующие директивы:
XCOPY *.txt D:DATA /EXCLUDE: exclude.txt – в данном примере из текущей папки в папку D:DATA мы скопировали все документы с расширение txt кроме файлов data1 и data2.
Другой пример, если указать строки вида OBJ или .OBJ, то из процесса будут исключены все объекты из папки OBJ и все объекты с расширением .OBJ.
/Z – позволяет дублировать сетевые документы с возобновлением.
Как известно, файловая система приписывает каждому файлу/документу владельца, как правило, это тот пользователь, который создал данный документ. При использовании команд COPY и XCOPY командной строки информация о старом владельце затирается, и владельцем копии становится тот юзер, под учетной записью которого собственно и производилось копирование файлов из командной строки.
/А и /M – задаем режим для архивных документов. Первый ключ после дублирования объекта оставляет у него атрибут «Архивный», второй же ключ отключает этот атрибут по завершении процесса манипуляций.
/O – данный параметр позволяет скопировать только те данные, которые были изменены не ранее указанной даты (дата у указывается в атрибуте /D[:дата], если сама дата не указана, то копирование будет производиться, только если источник новее результата ). Например:
XCOPY "С:My document*.*" "D:RESERVEMy document" /D
Тут будет произведено копирование только тех файлов через командную строку, которые были изменены со времени последнего подобного манипулирования или которых вообще не было в D: RESERVEMy document.
/S – данный ключ указывает, что кроме документов надо произвести и копирование папки, при условии, что она (они) не является пустой.
/Е – данный ключ подобен предыдущему, с той только разницей, что позволяет произвести копирование пустой папки через командную строку.
/W – будет включен режим запроса на нажатие любой клавиши перед началом дублирования.
/C – процесс копирования будет продолжен, даже если произошла ошибка
/I – Данный ключ говорит, что объект назначения должен быть каталогом. Например, если задать ключ /I в команде копирования всех объектов с расширением txt из текущего каталога в несуществующий еще подкаталог TEXT:
XCOPY *.txt TEXT /I
то подкаталог TEXT будет создан без дополнительных запросов.
/Q – этот ключ не будет отображать имена во время процесса
/F – этот ключ будет отображать полные пути источника и результата во время процесса
/L – это ключ всего-навсего отобразит те документы, которые надо скопировать, при этом сам процесс не произойдет.
/H – позволяет дублировать скрытые и системные документы.
/K — заменять объекты с атрибутом “Только для чтения”
/T – создает слепок структуры копируемых папок, но, самих документов не копирует, также не включаются пустые каталоги. Для того чтобы все же включить пустые каталоги и подкаталоги, нужно использовать комбинацию ключей /T /Е.
/U – обновляет содержимое каталога, то есть, копирует лишь те файлы, что уже имеются в каталоге.
/Y и /-Y определяют, нужно ли запрашивать подтверждение перед заменой. /Y означает, что такой запрос нужен, /-Y — не нужен.
/N – копирование с помощью командной строки с использованием сгенерированных коротких имен.
Как уже упоминалось выше, при использовании утилит COPY и XCOPY информация о прежнем владельце затирается. Что бы этого не происходило, можно воспользоваться командой SCOPY из пакета Resource Kit, которая имеет следующий синтаксис:
SCOPY источник [результат] [/О] [/A] [/S]
/О – позволяет дублировать информацию о владельце
/А – дублирование информации связанной с аудитом доступа к файлу или каталогу
/S – копирование файлов через командную строку из всех подкаталогов указанного каталога.
Командная строка COPY
Данный шедевр человеческой мысли позволяет произвести копирование (copy) через командную строку файла или файлов или даже их конкатенацию (объединение). Для решения подобных задач север сценариев Windows Script Host предоставляет в распоряжение метод CopyFile объекта FileSystemObject. Синтаксис утилиты командной строки copy, довольно устрашающий:
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B] источник [/A | /B] [+ источник [/A | /B] [+ . ]] [результат [/A | /B]]
/D – указывает на возможность создания зашифрованного файла.
/Y | /-Y – если выбран первый параметр, то будут отсутствовать запросы системы на подтверждение во время копирования (проще говоря, если придется топкой 1000 файлов копировать, то на каждый не будет выпрыгивать надоедливое “а вы уверены, или, может, другу позвоните?”), понятно, что второй параметр как раз то включает запрос подтверждения.
/Z – позволяет копировать данные по сети, кстати, в предыдущих вариантах данной утилиты этого ключа не наблюдалось.
/А – указывает, что файл является текстовым, если мы укажем данный параметр, то копирование прервется на метке конца файла ASCII код 26.
Если же данный параметр указан в самом конце, то эффект совсем другой. Произойдет полное копирование документа, но в копии будет добавлена метка конца файла если ее не было. Как результат, можете попробовать поэкспериментировать с pdf документом (my_file.pdf – размер документа составляет 247217 байт):
copy my_file.pdf/A new_file.pdf – на выходе мы получим документ new_file.pdf размером в 2538 байт.
/B – данный ключ идет по умолчанию и указывает, что файл является бинарным. То есть, происходит копирование всего документа.
/V – данный параметр включает проверку правильности копирования, сравнивая данные после завершения процедуры.
И так командная строка, копирование файлов и парочка примеров:
Копирование через командную строку файла 123.txt из текущего каталога в каталог D:\NEW под тем же именем:
COPY 123.txt D:\NEW
Копирование файла 123.txt из текущего каталога в каталог D:\NEW под новым именем new.txt:
COPY 123.txt D:\NEW\new.txt
Копирование всех документов с расширением txt с диска D:\ в каталог My Data на диске C:
COPY D:\*.txt "С:\My Data"
Допустим, мы находимся в каталоге D:\NEW и нам надо копирнуть в него все данные из каталога C:\DATA, в таком случае достаточно прописать следующий синтаксис:
COPY C:\DATA *.*
Используя командную строку, копируемые файлы можно склеить. Для этих целей достаточно использовать знак плюса «+», например:
COPY 1.txt +2.txt 3.txt– в данном примере содержимое документов 1.txt и 2.txt было объединено в 3.txt. Стоит помнить, что по дефолту, утилита COPY воспринимает данные как текстовые.
Вот пример с двоичными данными:
COPY /В *.dat all.dat – в данном варианте все данные с расширением dat из текущей папки были объединены в один файл all.dat.
Вообще, используя символ плюса «+» и мысли типа «а что если», можно проделать парочку экспериментов. Также стоит помнить ряд моментов:
Если название целевого объекта совпадает с одним из копируемых (кроме первого), то исходное содержимое целевого объекта будет утеряно.
Если имя целевого объекта опущено, то в его качестве будет использован первый объект из списка:.
COPY l.txt+2.txt – тут мы добавили к содержимому первого объекта содержимое второго.
COPY 1.txt +,, – данная конструкция позволяет присвоить объекту 1.txt текущую дату без его модификации.
Утилита COPY по своему первенству содержит ряд недостатков:
- нельзя производить копирование файлов через командную строку с атрибутами скрытый или системный, а также системных и с атрибутом «Только для чтения».
- обрыв всего процесса копирования при встрече с объектом, который в данный момент не поддается копированию.
В связи с такими неудобствами, умные люди подумали, и прибавили букву Х к названию COPY, чем решили массу проблем, создав утилиту XCOPY.
Командная строка REPLACE
Фактически, отличие данной утилиты в том, что она умеет заменять данные. Синтаксис довольно простой и понятный:
REPLACE [диск1:][путь1]имя_файла [диск2:] [путь2] [/А] [/Р] [/R] [/W]
REPLACE [диск1:][путь1]имя_файла [диск2:] [путь2] [/Р][/R][/S][/W][/U]
[диск1:] [путь1]имя_файла – определяем местонахождении копируемого объекта, или объектов.
[диск2:] [путь2] — определяем местонахождении объекта-результата. Как видно, имена замещаемых объектов задавать нельзя.
/А – добавляем в каталог-результат только новые объекты из каталога-результата (без перезаписи). Этот ключ нельзя использовать с ключами /S и / U.
/Р – выводится запрос на подтверждение перед заменой целевого или добавлением исходного файла.
/R – замещение не только обычных, но и защищенных от записи документов.
/S – позволяет производить поиск по всем подкаталогам целевого каталога и заменять файлы с совпадающими именами. Этот ключ нельзя использовать совместно с ключом /А. Поиск в каталогах, заданных параметром путь1, не производится.
/W – ожидание вставки диска перед началом выполнения
/U – режим обновления, то есть будут заменены только те объекты, которые имеют более раннюю дату модификации. Несовместимость с ключом /A.
Replace D:\Data\my_file.txt D:\Work – в папке Work заменяем файл my_file.txt на D:\Data\my_file.txt
При копировании файлов через командную строку посредством утилиты REPLACE, отсутствует возможность обновления скрытых или системных файлов. Для этого надо предварительно сменить их атрибуты.
Спасибо за внимание. Автор блога Владимир Баталий
В отличии от утилиты COPY, команда XCOPY тоже дает возможность скопировать файл через командную строку, но имеет большее количество функции. Однако, стоит отметить, что XCOPY дает возможность работать лишь с файлами и каталогами, но не с устройствами (например, принтер). Но, как всегда, сначала немного лирики…
В былые времена у меня был диск с операционной системой Windows XP Sp1, в то время не было установочных дисков с авто запуском, поэтому приходилось сначала входить в командную оболочку, а уже потом запускать на диске установочный файл. Диск был довольно уже пошарпан, виднелись маленькие дырочки, но как не странно, с помощью старого доброго Волков Коммандера мне удавалось скопировать все файлы через командную строку, хотя и не с первой попытки. Мало того, порой были времена когда система слетала под корень, и мне приходилось вручную производить копирование с одного винта на другой, занимало это сутки…
Запись в потоки NTFS
И еще, хотелось бы вспомнить о таком понятии как «копирование в потоки». Данный вопрос я частично затронул в статье с примерами по Windows Script Host при описании метода CreateTextFile объект FileSystemObject. Данная возможность предоставляется только на файловой системе NTFS. В простом варианте суть дела такова, к каждому документу или диску можно привязать свой поток, и записать информацию непосредственно в поток, то есть, информация будет записана, но сам документ не изменит своего размера. Давайте проделаем простенький эксперимент, пропишем в командной строке:
echo “Hellow, word”>new.txt:potok.txt – в данном примере мы создали текстовый документ new.txt, а фразу Hellow, word скопировали в поток potok.txt. Если выполнить команду notepad new.txt, то мы ничего не увидим, но, если выполнить так:
notepad new.txt.potok.txt – то мы увидим заветную фразу Hellow, word.
Командная строка xcopy команда.
При удалении файла, удаляется и поток, привязанный к нему. Есть один довольно примитивный способ узнать, что в нашем якобы пустом документе что-то зашито, это поместить его в архив, как результат, нулевой размер документа увеличится при архивировании.
Спасибо за внимание. Автор блога Владимир Баталий
Тоесть файл который я копируют абсолютно идентичен файлу который находиться в папке назначения (имя тоже).
Что произойдет в таком случае? Файл тупо перезапишется или windows сначала их сравнит (контрольная сумма?)?
И насколько копирование файлов при помощи проводника windows это хорошая идея?
- Вопрос задан более года назад
- 224 просмотра
Спросит у вас что делать.
Какое дело операционной системе до контрольных сумм, и прочего? Вы сказали скопировать - она скопирует.
Если скопировать невозможно - например файл с таким именем существует, он не сможет скопировать и спросит у вас что делать.
Бэкап вручную это не совсем гуд. Поэтому для бэкапа используются специальные инструменты. Но если вам нужно сделать вручную - какая разница чем вы его будете делать? Проводник ничем не хуже.
Если вручную надо скопировать файл - это отличная идея.
Если надо автоматизировать - проводник этого не позволяет.
Ну вдруг прочитать быстрее чем переписать.
А насчет бекапа я сам еще не решил чем делать. Толи софт какой использовать тали так сойдет. Бекап будет в ручную запускаться.
Спросит, что делать. Есть опция "применить это для всех таких же случаев", то есть если при копировании ста файлов у десяти их них оказались дубликаты в папке назначения - спросит один раз, а остальные девять сделает как сказало было в первом (если отметили опцию) иначе будет спрашивать каждый раз.
Илья лук, Да тоже ничего, но уже и в таких случаях батники пишутся. Винда сейчас имеет достаточно продвинутые VBS и PS, чтобы не трахаться с ручной работой там, где ее можно избежать.
Илья лук, это будет долго и печально. Если ты нажмешь "перезаписывать для всех", он будет тупо копировать всё, даже то, что не изменилось. Если ты нажмешь "не перезаписывать для всех", не скопируются измененные файлы.
А для простого бэкапа/синхронизвции (без наворотов типа истории, инкрементных и т.д.) в винде есть ROBOCOPY. Или если ты не хочешь командную строку, пользуй FreeFileSync или одну их кучи подобных.
винда спросит что делать, > копировать с заменой, пропустить > сравнить (отмечаем чекбоксами нужные файлы (можно сохранить оба)
итого будет синхронизироваться так, что ни один файл не будет заменен. Ненужные потом можно удалить
Из одной папки в другую надо скопировать файлы с заменой. Как автоматически можно сделать копии только тех файлов, которые будут заменены? Желательно, чтобы структура папок была сохранена, чтобы при необходимости копировать их с заменой обратно.
Простой 6 комментариев
karkir72, "копии только тех файлов, которые будут заменены?"
Это определяется по тем что уже лежат в директории бекапа?
Ну т.е. если такой файл в директории бекапа есть, то перезаписать его из места сохранения?
несовпадающие файлы не копировать?
Сергей, есть две папки, в одной 10 файлов, в другой 5. Нужно копировать из второй папки файлы в первую с заменой, но файлы, которую будут заменяться, надо сначала забэкапить, чтобы в случае необходимости восстановить обратно
karkir72, а. вот так. т.е. в первой папке (где 10 файлов), если будут заменяться файлы, то забекапить их в другое (третье место) , а уже потом только копировать ВСЕ из второй папки?
бекапить в каком виде? все заменяемые файлы в один архив? с датой замены?
Сергей, либо в архив, либо просто копировать, это не важно, главное иметь возможность при необходимости заменить их обратно
1) можно использовать нормальную систему контроля версий, например система - git, есть готовый сервис GitHub
посмотрите инфу в сети, видео на ютюбе, все станет понятно как и что работает.
2) можно самому написать скрипты например на PowerShell, что-то типа этого:
скрипт берет файлы из SourcePath сравнивает с DestinationPath, если есть совпадающие, то пакует совпадающие файлы из DestinationPath в 7z архив в папку BackupPath (имя файла дата+время)
после чего копирует файлы из SourcePath в DestinationPath
PS: в системе должен быть установлен 7zip , указать к нему путь в переменной $7zip
Upd:
Так же посмотрите ZPAQ, он поддерживает версионность файлов, т.е. внутри одного архива можно сохранять например 10 копий одного и того же файла с разными датами изменения.
Upd2:
Обновил скрипт, исправил некоторые ошибки (сравнение скрытых файлов, упаковка лишних файлов)
Читайте также: