Как скопировать файл c

Обновлено: 04.07.2024

Примеры использования средств C++ для работы с файлами

В теме приводятся примеры использования файловой системы C++ для:

  • чтения информации из файлов;
  • записи информации в файлы.

Содержание

  • 1. Функция, читающая строки из клавиатуры и записывающая их в файл
  • 2. Функция, которая читает текстовый файл и выводит его содержимое на экран
  • 3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
  • 4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
  • 5. Пример функции записывающей структурную переменную в файл
  • 6. Пример чтения структурной переменной из файла
  • 7. Пример чтения/записи массива структур в файл. Функции write() , read()
  • 8. Пример записи/чтения массива чисел типа double
  • 9. Пример чтения из файла строк. Функция getline()
  • 10. Пример чтения строк из файла. Функции getline() + eof()

Поиск на других ресурсах:

1. Функция, читающая строки из клавиатуры и записывающая их в файл

Результат работи программы:

2. Функция, которая читает текстовый файл и выводит его содержимое на экран

Функция Example2() читает содержимое файла filename , имя которого есть входящим параметром функции.

3. Пример бесформатного ввода/вывода. Копирование одного файла в другой

В примере реализована функция Example3() , которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get() .

Вызов функции Example3() из функции main() может быть следующим:

4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()

Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток << используется функция put() . Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.

5. Пример функции записывающей структурную переменную в файл

По данному примеру можно реализовывать собственные функции, которые будут записывать структуры или классы в файл.

Реализована функция Example5() , которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате ( ios::binary ).

6. Пример чтения структурной переменной из файла

Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK . Полученное значение формируется как входящий параметр-ссылка на тип BOOK . Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read() .

Результат работы программы

8. Пример записи/чтения массива чисел типа double
  • запись в файл массива M чисел типа double функцией write() ;
  • чтение из файла массива чисел типу double функцией read() .

Файл открывается в двоичном формате.

Результат работи программы:

9. Пример чтения из файла строк. Функция getline()
10. Пример чтения строк из файла. Функции getline() + eof()

В примере реализована функция Example10() , которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof() .

Для работы мы используем класс File и метод Copy, в который в качестве первого параметра, передаём полный путь к файлу, который необходимо скопировать. Вторым параметров указываем, куда мы копируем файл. Третий, необязательный параметр, который имеет тип bool, позволяет определить действие, которое нужно выполнить, если в папке dir2 уже содержится файл (2.txt). Например, если установить значение true, то тогда при копировании файла (1.txt), файл (2.txt) будет перезаписан, если же мы установим значение false, то в таком случае получим выброс исключения, так как файл уже существует, а его изменение (перезапись) мы запретили.

Так же не забывайте при работе с пространством имён System.IO использовать блоки try catch.


Как скопировать все файлы?
И ещё один пример, в котором рассмотрим простую задачу, в которой нужно скопировать все файлы из папки Dir1 в папку Dir2.

Сначала с помощью метода GetFiles, используя маску (*.*), получаем все файлы в папке Dir1, а затем по очереди копируем их. Если Вам необходимо скопировать все файлы только какого-то определенного типа, например все текстовые файлы (.txt), то тогда указываем маску (*.txt), для mp3 файлов (*.mp3) и так далее. Значение true указываем в том случаи, если требуется перезаписать старые файлы в папке Dir2.

САНЯ
24.08.2016 в 09:37
хм, к примеру я получил список файлов в папке и подпапках с датой изменения

а как теперь скопировать все файлы к примеру в c:1 и потом через некоторе время скопировать файлы которые изменились?

и потом через некоторе время скопировать файлы которые изменились?

Например, можно добавить таймер и запускать его сразу после первого копирования.


ADMIN
27.08.2016 в 14:49
как скопировать все папки со всеми файлами

можно использовать рекурсию, например:

как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))

САНЯ
27.08.2016 в 23:58
если честно, то у меня ничего не выходит, что то я совсем запутался вот полный листинг кода, задача получить все файлы и папки с подпапками в с:2 вывести листбокс1, потом скопировать в c:1, а там уже сам))
[cut]

Ответ на этот вопрос есть в статье.

если файл будет открыт, он скопируеться?

Да, но лучше всё равно обработать возможность возникновения System.IO.IOException

САНЯ
02.09.2016 в 19:39
админ, новерно крайний вопрос)) в листбокс файл + дата изменения, скопировать как не получаеться и оно понятно, а как отделить при копировании дату изменения до пробела

ADMIN
04.09.2016 в 04:44
Получить только путь из строки?

САНЯ
05.09.2016 в 05:30
Админ а что не правильно, пытаюсь удалить совпадение строк? удаляет только первую

ADMIN
06.09.2016 в 03:32
Поставь точку остановы и посмотри, что происходит со списком listbox1 до удаления элемента и после.

САНЯ
09.09.2016 в 01:31
админ привет, подскажи что не так? после удаления сравнений, в листбоксе2 остаеться к примеру путь с:22.txt 11.11.11 11:11 но при использовании ниже приведенного кода, выдаёт ошибку!

ADMIN
10.09.2016 в 07:27
выдаёт ошибку


САНЯ
11.09.2016 в 09:21
решил попробывать вставить рекурсию по нажатию кнопки

Дополнительные сведения: Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется.

Требуется скопировать файл, причем так, чтобы эта операция была переносимой, т.е. без использования зависящего от ОС программного интерфейса.

Используйте файловые потоки С++, определенные в <fstream>, для копирования одного потока в другой. Пример 10.9 показывает, как можно скопировать поток с помощью буфера

Пример 10.9. Копирование файла

const static int BUF_SIZE = 4096;

int main(int argc, char** argv)

ios_base::in | ios_base::binary); // Задается двоичный режим, чтобы

std::ofstream out(argv[2], // можно было обрабатывать файлы с

ios_base::out | ios_base::binary), // любым содержимым

// Убедитесь, что потоки открылись нормально.

in.read(&buf[0], BUF_SIZE); // Считать максимум n байт в буфер,

out.write(&buf[0], in.gcount()); // затем записать содержимое буфера

> while (in.gcount() > 0); // в поток вывода.

// Проверить наличие проблем в потоках.

Можно посчитать, что копирование файла — это простая операция чтения из одного потока и записи в другой поток. Однако библиотека потоков C++ достаточно большая, и существует несколько различных способов чтения и записи потоков, поэтому надо обладать некоторыми знаниями об этой библиотеке, чтобы избежать ошибок, снижающих производительность этой операции.

Пример 10.9 работает быстро, потому что используется буферизация ввода-вывода. Функции read и write оперируют сразу всем содержимым буфера вместо посимвольного копирования, когда в цикле считывается символ из потока ввода в буфер и затем записывается в поток вывода. При их выполнении не делается никакого форматирования, подобного тому, которое выполняется операторами сдвига влево и вправо, что ускоряет выполнение операции. Кроме того, поскольку потоки работают в двоичном режиме, не надо специально обрабатывать символы EOF. В зависимости от используемого вами оборудования, ОС и т.д. вы получите различный результат при различных размерах буфера. Экспериментально вы можете найти наилучшие параметры для вашей системы

Однако можно добиться большего. Все потоки C++ уже буферизуют данные при их чтении и записи, поэтому в примере 10.9 фактически выполняется двойная буферизация. Поток ввода имеет свой собственный внутренний буфер потока, который содержит символы, прочитанные из исходного файла, но еще не обработанные с помощью read, operator<<, getc или любых других функций-членов, а поток вывода имеет буфер, который содержит вывод, записанный в поток, но не в «пункт назначения» (в случае применения ofstream это файл, но могла бы быть строка, сетевое соединение и кто знает, что еще). Поэтому лучше всего обеспечить непосредственный обмен данных буферов. Вы это можете сделать с помощью оператора operator<<, который работает иначе с буферами потоков. Например, вместо цикла do/while приведенного в примере 10.9, используйте следующий оператор.

Не следует размещать этот оператор в теле цикла, замените весь цикл одной строкой. Это выглядит немного странно, поскольку обычно оператор operator<< говорит, «возьмите правую часть и передайте ее в поток левой части», однако, поверьте мне, эта запись имеет смысл, rdbuf возвращает буфер потока ввода, а реализация operator<<, принимающая буфер потока справа, считывает каждый символ буфера ввода и записывает его в буфер вывода. Когда буфер ввода заканчивается, он «знает», что должен заново заполнить себя данными из реального источника, a operator<< ведет себя не лучше.

Пример 10.9 показывает, как можно скопировать содержимое файла, но ваша ОС отвечает за управление файловой системой, которая осуществляет копирование, так почему бы не предоставить право ОС сделать эту работу? В большинстве случаев на это можно ответить, что прямой вызов программного интерфейса ОС, конечно, не является переносимым решением. Библиотека Boost Filesystem скрывает от вас множество зависящих от ОС программных интерфейсов, предоставляя функцию copy_file, которая выполняет системные вызовы ОС для той платформы, для которой она компилируется. Пример 10.10 содержит короткую программу, которая копирует файл из одного места в другое.

Пример 10.10. Копирование файла при помощи Boost

using namespace std;

using namespace boost::filesystem;

int main(int argc, char** argv)

// Преобразовать аргументы в абсолютные пути, используя «родное»

path src = complete(path(argv[1], native));

path dst = complete(path(argv[2], native));

> catch (exception& e)

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

path src = complete(path(argv[1], native));

Первый аргумент — это текстовая строка, представляющая путь, например «tmp\foo.txt», а второй аргумент — имя функции, которая принимает аргумент типа string и возвращает значение типа Boolean, которое показывает, удовлетворяет или нет путь определенным правилам. Функция native говорит о том, что проверяется родной формат ОС. Я его использовал в примере 10.10, потому что аргументы берутся из командной строки, где они, вероятно, вводятся человеком, который, по-видимому, использует родной формат ОС при задании имен файлов. Существует несколько функций, предназначенных для проверки имен файлов и каталогов и названия которых не требует пояснений: portable_posix_name, windows_name, portable_name, portable_directory_name, portable_file_name и no_check. Особенности работы этих функций вы найдете в документации.

Функция complete формирует абсолютный путь, используя текущий рабочий каталог и переданный ее относительный путь. Так, я могу следующим образом создать абсолютный путь к исходному файлу.

path src = complete(path("tmp\foo.txt", native));

В том случае, если первый аргумент уже имеет абсолютное имя файла, функция complete выдает заданное значение и не будет пытаться его присоединить к текущему рабочему каталогу. Другими словами, в следующем операторе, выполняемом при текущем каталоге «c:myprograms», последний будет проигнорирован, потому что уже задан полный путь.

path src = complete(path("c:\windows\garbage.txt", native));

Пример: простое последовательное копирование файла

Пример: простое последовательное копирование файла В следующих разделах приведены примеры коротких программ, реализующих простое последовательное копирование содержимого файла тремя различными способами:1. С использованием библиотеки С.2. С использованием Windows.3. С

Установка размера файла, инициализация файла и разреженные файлы

Установка размера файла, инициализация файла и разреженные файлы Функция SetEndOfFile позволяет переустановить размер файла, используя текущее значение указателя файла для определения его размера. Возможно как расширение, так и усечение файла. В случае расширения файла

13.5.1. Копирование

13.5.1. Копирование Самый простой вариант создания резервной копии — использование команды cp (копирование файлов). Только в этом случае необходимо обязательно сохранять права доступа к файлу. Вот как может выглядеть команда, дублирующая директорию /home на примонтированном

Копирование

Копирование Вставьте компакт-диск в привод. Щелкните мышью на кнопке Копировать с диска (рис. 3.22). С помощью соответствующих флажков отметьте произведения, предназначенные для копирования. В строке состояния при этом будет отображаться количество выбранных

Копирование объектов

Копирование объектов Представьте, что мы строим кровать, которая стоит на четырех ножках-опорах. Мы построили одну ножку, расположили ее в нужном месте, теперь необходимо построить еще одну. Каждый раз строить новую нерационально, особенно если это не просто ножка, а

Копирование

Копирование В этом примере мы копируем базу данных, находящуюся на диске D: удаленного сервера, в файл копии на диске F: той же самой удаленной машины. Мы направляем подробный отчет об операции в файл протокола в другом каталоге. Как обычно, пример является одной строкой:gbak

Перемещение и копирование

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

Копирование объектов

Копирование объектов С командой COPY вы познакомились в главе 3. Повторим основные моменты, связанные с копированием объектов в AutoCAD с указанием базовой точки.Выполните следующие действия.1. Создайте простой объект или откройте чертеж, содержащий такой объект.2. Вызовите

Копирование

Копирование узлов

Копирование узлов Преобразование может включать в себя не только создание новых, но и копирование существующих узлов. Для этого можно использовать элементы xsl:copy и xsl:copy-of, использование которых будет подробно разобрано

Неудачи и копирование

Неудачи и копирование Патрик Коллисон, студент Массачусетского технологического институтаЛарри Уолл писал, что типичными чертами великих программистов являются лень, нетерпение и гордыня. Я не знаю, врожденные это особенности или они приобретаются прилежной работой

4.2.3. Копирование, переименование и перемещение файла или папки

4.2.3. Копирование, переименование и перемещение файла или папки Для копирования файла (группы файлов) или папки (группы файлов) нужно выполнить следующие действия:1. Выделите файлы — можно выделить один файл или каталог — для этого просто щелкните по нему. Для выделения

Весь функционал необходимый для создания, удаления, копирования или перемещения файлов сосредоточен в методах классов File и FileInfo. Они представлены в таблице ниже.

Все методы класса File статические, методы класса FileInfo работают только через объектную ссылку.

Многие из этих методов принимают строку в качестве параметра. Это строка содержит путь к файлу, его имя и расширение. Может быть возвращена методами класса Path. Путь может быть абсолютным (полный путь от корня диска до файла с расширением) или относительным, то есть отчитываться от текущей директории.

Для использования любого из этих методов следует включить пространство имен System.IO перед использованием их в коде приложения.

Удаление

Метод Delete класса File удаляет файл, путь к которому (относительный или абсолютный) передан ему строкой в качестве параметра.

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

Удалить можно только созданный и закрытый файл. И если в первом случае не возникнет исключение, во втором – обязательно. Поэтому перед процедурой удаления лучше организовывать проверку существования файла:

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

Копирование файлов

Класс File для удаления имеет в своей функционале метод Copy(), принимающий два параметра типа string: имя копируемого файла и имя конечного. Имена передаются методу вместе с путем к нему (абсолютным или относительным).

Метод копирует информацию из файла и все файловые атрибуты в файл-назначения с указанным именем. Если имена файла копируемого файла и файла назначения совпадают, копирование не будет выполнено. Если необходим такой функционал нужно воспользоваться перегруженной версией метода с третьим параметром типа Boolean.

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

Метод CopyTo класса FileInfo принимает только один строковый параметр – файл назначения, работает аналогично методу Copy класса File.

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

Файл назначения перед копированием не должен существовать. Метод CopyTo его создаст. Поэтому в примере выше инициирована проверка его существования перед копированием.

Перемещение файлов

Метод Move принимает два параметра типа string: файл-источник и файл-назначения. При вызове копирует информацию и все атрибуты из файла-источника в файл-назначения, затем файл источник удаляется. Конечный файл не должен существовать перед копированием.

Допустимо если имя файла-источника совпадает с именем фала назначения. Но перемещение файла-источника в файл-назначения внутри одной директории вызовет исключение.

Файл-источник не будет удален после перемещения, если файл был открыт, но не был зарыт до начала копирования. Перед копированием обязательно стоит удостовериться в том, что исходный файл существует.

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

Вторая проверка существования файла-источника инициирована в тех случаях, когда перемещение совмещено в коде приложения с чтением файла. Особенно это касается многопоточных приложений. Если проверка показывает, что файл еще существет, то необходимо закрыть его и запустить процедуру удаления вручную, например, с помощью File.Delete.

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