C++ 将文件从 Qt 传输到外部 USB 驱动器
C++ Transfer Files From Qt to External USB Drive
我是 Qt 的新手,我需要帮助将所有文件从本地计算机的特定路径传输到外部 USB 驱动器。
复制单个文件
您可以使用 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
方法,它很可能存在(很有可能因为它不是原子操作,目录或文件可能会在对话框和复制操作之间被删除或重命名,但这是不同的问题)。
我已经解决了 QStorageInfo::mountedVolumes()
的问题,其中 return 连接到机器的设备列表。但除了 Pendrive 或 HDD 之外,它们都没有名字。因此 (!(storage.name()).isEmpty()))
它将 return 仅指向那些设备的路径。
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 中创建一个文件夹,并且我为这些文件指定了一个静态名称。然后我只是将数据从本地机器的文件复制到我在 QFile::copy(srcPath, dstPath)
的帮助下在 USB 中创建的文件。我希望它会对某人有所帮助。
我是 Qt 的新手,我需要帮助将所有文件从本地计算机的特定路径传输到外部 USB 驱动器。
复制单个文件
您可以使用 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
方法,它很可能存在(很有可能因为它不是原子操作,目录或文件可能会在对话框和复制操作之间被删除或重命名,但这是不同的问题)。
我已经解决了 QStorageInfo::mountedVolumes()
的问题,其中 return 连接到机器的设备列表。但除了 Pendrive 或 HDD 之外,它们都没有名字。因此 (!(storage.name()).isEmpty()))
它将 return 仅指向那些设备的路径。
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 中创建一个文件夹,并且我为这些文件指定了一个静态名称。然后我只是将数据从本地机器的文件复制到我在 QFile::copy(srcPath, dstPath)
的帮助下在 USB 中创建的文件。我希望它会对某人有所帮助。