Как сделать копию файла в c

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

Команда XCOPY используется для копирования файлов и каталогов с сохранением их структуры. По сравнению с командой COPY имеет более широкие возможности и является наиболее гибким средством копирования в командной строке Windows

Формат командной строки:

XCOPY источник [целевой_объект] [/A | /M] [/D[:дата]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/EXCLUDE:файл1[+файл2][+файл3]. ]

Параметры командной строки:

источник - Копируемые файлы.

целевой_объект - Расположение или имена новых файлов.

/A - Копирование только файлов с установленным архивным атрибутом; сам атрибут при этом не изменяется.

/M - Копирование только файлов с установленным архивным атрибутом; после копирования атрибут снимается.

/D:m-d-y - Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.

/EXCLUDE:файл1[+файл2][+файл3]. - Список файлов, содержащих строки с критериями для исключения файлов и папок из процесса копирования. Каждая строка должна располагаться в отдельной строке файла. Если какая-либо из строк совпадает с любой частью абсолютного пути к копируемому файлу, такой файл исключается из операции копирования. Например, указав строку \obj\ или .obj, можно исключить все файлы из папки obj или все файлы с расширением OBJ соответственно.

/P - Вывод запросов перед созданием каждого нового файла.

/S - Копирование только непустых каталогов с подкаталогами.

/E - Копирование каталогов с подкаталогами, включая пустые. Эквивалентен сочетанию ключей /S /E. Совместим с ключом /T.

/V - Проверка размера каждого нового файла.

/W - Вывод запроса на нажатие клавиши перед копированием.

/C - Продолжение копирования вне зависимости от наличия ошибок.

/I - Если целевой объект не существует и копируется несколько файлов, считается, что целевой объект задает каталог.

/Q - Запрет вывода имен копируемых файлов.

/F - Вывод полных имен исходных и целевых файлов.

/L - Вывод имен копируемых файлов.

/G - Копирование зашифрованных файлов в целевой каталог, не поддерживающий шифрование.

/H - Копирование, среди прочих, скрытых и системных файлов.

/R - Перезапись файлов, предназначенных только для чтения.

/T - Создание структуры каталогов без копирования файлов. Пустые каталоги и подкаталоги не включаются в процесс копирования. Для создания пустых каталогов и подкаталогов используйте сочетание ключей /T /E.

/U - Копирование только файлов, уже имеющихся в целевом каталоге.

/K - Копирование атрибутов. При использовании команды XСOPY обычно сбрасываются атрибуты "Только для чтения".

/N - Использование коротких имен при копировании.

/O - Копирование сведений о владельце и данных ACL.

/X - Копирование параметров аудита файлов (подразумевает ключ /O).

/Y - Подавление запроса подтверждения на перезапись существующего целевого файла.

/-Y - Запрос подтверждения на перезапись существующего целевого файла.

/Z - Копирование сетевых файлов с возобновлением.

/B - Копирование символической ссылки вместо ее целевого объекта.

/J - Копирование с использованием небуферизованного ввода/вывода. Рекомендуется для очень больших файлов.

Ключ /Y можно установить через переменную среды COPYCMD.

Ключ /-Y командной строки переопределяет такую установку.

Примеры использования XCOPY

XCOPY /? - выдать краткую справку по использованию команды.

Что означает D:\copy1:
имя файла или каталога
(F = файл, D = каталог)? D

После ответа D целевой каталог будет создан и копирование будет выполняться в D:\COPY1\. Для подавления запроса на создание целевого каталога используется параметр /I:

xcopy C:\users D:\copy1 /I

xcopy C:\users D:\copy1 /H /Y /C - копирование файлов, включая скрытые и системные, с подавлением запроса на перезапись существующих и возобновлением при ошибке. Если существующий в целевом каталоге файл имеет атрибут "Только чтение", то копирование не выполняется. Для перезаписи таких файлов используется ключ /R

xcopy C:\users D:\copy1 /H /Y /C /R /S - скопировать все файлы и подкаталоги ( /S ) с перезаписью существующих без запроса ( /Y ) , включая скрытые и системные. ( /H ) с перезаписью файлов с атрибутом "Только чтение" (/R) и игнорированием ошибок ( /C )

xcopy C:\users D:\copy1 /H /Y /C /R /S /EXCLUDE:C:\users\listnotcopy.txt - то же, что и в предыдущем случае, но текстовый файл C:\users\listnotcopy.txt задает признаки исключения из процедуры копирования. Пример содержимого файла:

\User1\ - исключить из копирования каталог C:\users\user1
All Users исключить из копирования каталог C:\users\All Users
de*.* - исключить из копирования все файлы и каталоги, начинающиеся на буквосочетание "de"

xcopy C:\users\*.exe D:\copy1 /H /Y /C /R /S /EXCLUDE:C:\users\listnotcopy.txt - то же, что и в предыдущем примере, но выполняется только копирование исполняемых файлов с расширением .exe .

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I - копирование всех файлов с расширением .ini из каталога временных файлов в каталог D:\copy1\ini\ . Если целевой подкаталог \ini\ не существует, то он будет создан без запроса пользователю ( /I ) .

xcopy %TEMP%\*.ini D:\copy1\ini /H /Y /C /R /S /I /D:09-16-2013 - то же, что и в предыдущем примере, но выполняется копирование только тех файлов, у которых установлена дата изменения 16 сентября 2013 года и старше.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T - создать структуру папок диска C: в каталоге D:\copy1\LISTDIR . Копирование файлов не выполняется. Копируются только папки, включая пустые, скрытые и системные.

xcopy C:\ D:\copy1\LISTDIR /H /Y /C /R /S /I /E /T /D:09-16-2013 воссоздать в каталоге D:\copy1\LISTDIR структуру папок диска C: , с датой изменения 16 сентября 2013 года и позже.

Для добавления новых файлов в каталоги и обновления существующих на более поздние версии, можно использовать команду REPLACE.

Наличие большого объема буфера, который не является экономичным для больших значений буфера ("большой" в зависимости от платформы и ОС, но я сомневаюсь, что он превысит, скажем, один мегабайт, прежде чем нанести убывающий доход). В некоторых системах вам может быть разрешено выделять гораздо больше, чем физическая доступная память, а буфер подкрепляется областью подкачки на диске. На этом этапе, если вы попытаетесь скопировать весь файл одним махом, вы можете в конечном итоге прочитать и записать большую часть файла в область подкачки, а затем вернуться из области подкачки к новому файлу, эффективно удвоить (в наименьшее) время копирования.

Поэтому я бы использовал цикл.

Вам также необходимо будет проверить ошибки в распределении памяти и записи файлов, а также учитывать, что размер, являющийся int может вызвать проблемы с большими файлами (в настоящее время размер файла 2 ГБ - это доступный размер файла, но он переполнит 32-разрядное целое число со знаком).

Кроме того, может оказаться полезным вернуть статус ошибки вместо размера. Если вы возвращаете ноль, то вы знаете, что количество записанных байтов равно размеру ввода. Если вам нужно вернуть оба значения, вы можете поместить ошибку в переменную, переданную указателем:

Таким образом, в случае ошибки вы узнаете, почему процедура возвратила нуль. Также вы сможете создавать файлы нулевой длины в случае необходимости (функция вернет 0, но статус также будет 0, что указывает на то, что запись нулевых байтов не является ошибкой).


в смысле "по-серьезнее"? копирование дерева папок это классический рекурсивный алгоритм, куда серьезнее то? разве что в вашем алгоритме не хватает защиты от исключений при работе с объектами ФС, а они будут гарантированно, если запустить программу вне подготовленной тестовой среды

Можете заменить классы Directory и File на DirectiryInfo и FileInfo, можно будет в одном цикле все написать, но с внутренним условием на проверку типа, или вообще в LINQ запрос завернуть в одну строчку, Только делать такого не нужно, работа с ФС требует аккуратности и внимания к исключениям. Что делать если во время копирования папки вам поменяли права на папку? и таких вопросов масса

2 ответа 2

Времена однозадачных одно-пользовательских ОС ушли, во всяком случае на PC. Там можно было позволить себе не проверять права на файлы и не бояться. что после проверки на наличие, файла (вдруг!) не окажется при чтении. Но и там были проблемы, которые нужно было решать, например ошибки чтения на аппаратном уровне.

Файловая система штука нестабильная. Может произойти что угодно, от отключения электричества, до изменения прав вредным админом прямо во время работы вашей программы. И это нужно учитывать.

Копирование дерева папок, как базовый алгоритм не представляет сложностей, классический рекурсивный обход в глубину или ширину, на усмотрение автора. В самом вопросе и соседнем ответе их приведено несколько. Но в многопользовательской многозадачной среде придется учитывать особенности этой среды на каждом этапе алгоритма.

1. Обязательная обработка исключений.

Файловые операции могут генерировать (и генерируют) массу различных исключений (исключения File.Open ). По хорошему, каждый тип исключений нужно обрабатывать в отдельном блоке catch , почему см. ниже.

2. Копирование папки операция комплексная и долгая

  • на n-ном шаге операции произошло исключение: игнорировать, прервать операцию, спросить у пользователя?
  • как было сказано выше, исключения бывают разные, соответственно как будем реагировать на конкретные типы исключений?
  • что делать с уже обработанными объектами прерванной операции: удалить, оставить как есть?
  • если удалить, то как быть с замещенными файлами? Да да, должен быть бекап или теневая копия, или CVS, или что там еще можно придумать. а если их нет?

И это я еще не упомянул возможное отключение носителя нерадивым пользователем во время копирования, битые кластеры, электрика с рубильником, соседа сварщика, погоду на Венере и еще много чего, что так или иначе может спровоцировать исключение.

3. Серебряной пули нет

На все перечисленные и не перечисленные вопросы придется отвечать при любых операциях с файлами, в некоторых случаях ответы простые, в некоторых нет. Универсального решения тут нет. Где-то нужна надежность, где-то целостность данных, где-то скорость, а где-то отсутствие надоедливых вопросов пользователю. Цели разные, решения тоже.

Есть много способов, чтобы скопировать файл в Windows.

Самый простой способ с помощью команды Copy, которые могут быть доступны щелкнув правой кнопкой мыши на файл и выбрав команду из контекстного меню.

Сделать копию файла в Windows

Затем вы можете щелкните левой кнопкой мыши где-то в окне, так что больше не выбран файл, нажмите правой кнопкой мыши и выберите команду Вставить.

Если вы просматриваете файл в окне проводника (например, двойным щелчком по папке, чтобы открыть его с помощью Проводника), вы можете скопировать файл с помощью опции в меню Правка (Edit, копировать и редактировать, вставлять).

Можно также использовать сочетания клавиш (Ctrl + C для копирования и Ctrl + V для вставки). После того, как копия файла создается, имя файла будет предшествовать "Копия", чтобы указать, что это копия. Вы также можете удерживать нажатой клавишу Control при перемещении файла, чтобы создать копию. Знак плюс появится на иконке файла, как вы перетащите его, чтобы вы знаете, вы создаете копию.

Вкладка Настройка позволяет изменить значок папки, и вы даже можете присвоить изображение, которое будет отображаться, если папка просматривается в виде эскиза в проводнике Windows (View, Thumbnails).

Читайте также: