Как скопировать файлы из массива?

285
20 ноября 2017, 20:27

Только вникаю не судите =)

Итак у меня есть 3 файла которые нужно скопировать из пункта E в пунт D.

Как решить эту задачу?

std::string MassiveFiles[3] = {"1.txt","2.txt","3.txt"}; // или как правильно записать?
for (int i = 0; MassiveFiles; i++)
{
    CopyFile("E:\\откуда", "D:\\куда", 0);  
}
Answer 1

1. Объявление массива с именами файлов

Имена файлов для копирования можно хранить в массиве, как у вас:

string files[3] = {"one.txt", "two.txt", "three.txt"};

причём если массив при объявлении сразу инициализируется, то размер можно не указывать:

string files[] = {"one.txt", "two.txt", "three.txt"};

или можно хранить имена файлов в векторе (вектор более гибок, его размер можно изменять, также его удобней передавать в функции):

vector<string> files = {"one.txt", "two.txt", "three.txt"};

2. Итерирование по массиву/вектору

  • Самый простой способ — итерироваться используя индексы. Если число элементов известно, то условие завершения цикла можно записать как i < число_элементов:

    for (int i = 0; i < 3; ++i) {
        string file = files[i];
        // дальше работаем с переменной `file`

    Если число элементов неизвестно, то в случае вектора его можно получить используя метод vector::size():

    for (int i = 0; i < files.size(); ++i) {
        string file = files[i];
        // дальше работаем с переменной `file`
  • Также есть сокращённая удобная форма итерирования без индексов:

    for (string file : files) {
        // дальше работаем с переменной `file`

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

Кажется тут здесь достаточно получить строки пути-источника и пути-назначения, это можно сделать с помощью конкатенации:

string source = "E:\\" + file;
string destination = "D:\\" + file;

Дальше эти переменные можно передать в функцию копирования файлов:

CopyFile(source.c_str(), destination.c_str(), false);

Полный код на Ideone

Answer 2

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

#include <iostream>
#include <windows.h>
#include <vector>
#include "Shlwapi.h"
#pragma comment(lib,"ShLwApi.Lib") // для PathCombine
using namespace std;
int main() {
    vector<string> files = { "one.txt", "two.txt", "three.txt" };
    TCHAR t1Dir[MAX_PATH + 2] = { 0 };
    TCHAR t2Dir[MAX_PATH + 2] = { 0 };
    for (auto file : files) {
        auto source = PathCombine(t1Dir, "E:\\", file.c_str());
        auto destination = PathCombine(t2Dir, "D:\\", file.c_str());
        CopyFile(source, destination, false);
    }
    return 0;
}
READ ALSO
Помогите пожалуйста С++ [требует правки]

Помогите пожалуйста С++ [требует правки]

Даны 2 строки, состоящие из слов, разделенных пробеламиОбьеденить обе строки и поменять второе и третье слово местами

251
Выбор файлов в QTreeView

Выбор файлов в QTreeView

У меня есть QComboBox, который показывает, какие папки я могу выбрать

214
Разобрать код задач по ряду Тейлора

Разобрать код задач по ряду Тейлора

Доброго времени суток, есть проблема с 2мя задачами по cppЕжели кто осилит - гляньте и дайте вердикт, правильно или нет (по возможности с пояснением...

308
Данные из файлов [требует правки]

Данные из файлов [требует правки]

Как в с++ манипулировать данными из текстового файла, которые находятся на одной или нескольких строках?

282