C ++ передача файлов с Qt на внешний USB-накопитель

Я новичок в Qt, и мне нужна помощь в переносе всех файлов с определенного пути локальной машины на внешний USB-накопитель.

1

Решение

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

Ты можешь использовать QFile::copy.

QFile::copy(srcPath, dstPath);

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

if (QFile::exist(dstPath)) QFile::remove(dstPath);

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

bool copyFiles() {
const QString srcPath = QFileDialog::getOpenFileName(this, "Source file", "",
"All files (*.*)");
if (srcPath.isNull()) return false; // QFileDialog dialogs return null if user canceled

const QString dstPath = QFileDialog::getSaveFileName(this, "Destination file", "",
"All files (*.*)"); // it asks the user for overwriting existing files
if (dstPath.isNull()) return false;

if (QFile::exist(dstPath))
if (!QFile::remove(dstPath)) return false; // couldn't delete file
// probably write-protected or insufficient privileges

return QFile::copy(srcPath, dstPath);
}

Копирование всего содержимого каталога

Я расширяю ответ на случай srcPath это каталог. Это должно быть сделано вручную и рекурсивно. Вот код, чтобы сделать это, без проверки ошибок для простоты. Вы должны отвечать за выбор правильного метода (взгляните на QFileInfo::isFile для некоторых идей.

void recursiveCopy(const QString& srcPath, const QString& dstPath) {
QDir().mkpath(dstPath); // be sure path exists

const QDir srcDir(srcPath);
Q_FOREACH (const auto& dirName, srcDir.entryList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name)) {
recursiveCopy(srcPath + "/" + dirName, dstPath + "/" + dirName);
}

Q_FOREACH (const auto& fileName, srcDir.entryList(QStringList(), QDir::Files, QDir::Name)) {
QFile::copy(srcPath + "/" + fileName, dstPath + "/" + fileName);
}
}

Если вам нужно запросить каталог, вы можете использовать QFileDialog::getExistingDirectory.

Заключительные замечания

Оба метода предполагают srcPath существует. Если вы использовали QFileDialog методы, весьма вероятно, что он существует (очень вероятно, потому что это не атомарная операция, и каталог или файл могут быть удалены или переименованы между диалогом и операцией копирования, но это другая проблема).

3

Другие решения

Я решил проблему с QStorageInfo::mountedVolumes() которые возвращают список устройств, которые подключены к машине. Но у всех них не будет названия, кроме Pendrive или HDD. Так (!(storage.name()).isEmpty())) он вернет путь только к этим устройствам.

QString location;
QString path1= "/Report/1.txt";
QString locationoffolder="/Report";

foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
if (storage.isValid() && storage.isReady() && (!(storage.name()).isEmpty())) {
if (!storage.isReadOnly()) {

qDebug() << "path:" << storage.rootPath();
//WILL CREATE A FILE IN A BUILD FOLDER
location = storage.rootPath();
QString srcPath = "writable.txt";
//PATH OF THE FOLDER IN PENDRIVE
QString destPath = location+path1;
QString folderdir = location+locationoffolder;
//IF FOLDER IS NOT IN PENDRIVE THEN IT WILL CREATE A FOLDER NAME REPORT
QDir dir(folderdir);
if(!dir.exists()){
dir.mkpath(".");
}

qDebug() << "Usbpath:" <<destPath;
if (QFile::exists(destPath)) QFile::remove(destPath);
QFile::copy(srcPath,destPath);
qDebug("copied");

}
}
}

Мне пришлось создать папку, а также на USB из-за моих требований, и я дал статическое имя для файлов. Затем я просто скопировал данные из файла локальной машины в файл, который я создал в USB с помощью QFile::copy(srcPath, dstPath). Надеюсь, это кому-нибудь поможет.

2

По вопросам рекламы [email protected]