【问题标题】:Qdir's function exists() always returns true, even when the directory doesn't existQdir 的函数 exists() 总是返回 true,即使目录不存在
【发布时间】:2011-06-09 17:19:42
【问题描述】:

我正在尝试对项目的第一部分进行防错,其中在指定的基本目录中创建了一个文件夹。基本目录由用户在 QLineEdit 中手动选择,或者通过使用 QFileDialog 浏览计算机的目录来选择。我正在尝试使用以下命令在其中创建子文件夹之前检查基本目录是否存在:

QString base_dir = ui->baseDir->text();
QString blank = "";
QString no_text1 = "Please enter a valid directory";
if( base_dir==no_text1 || base_dir==blank ) {
    if( !QDir( base_dir ).exists() ) {         //does base directory exist?
    ui->baseDir->setText( no_text1 );
    return;
    }
}

问题是,无论我在行编辑中键入有效目录还是无效目录(即随机短语),第二个 if 语句总是返回 false,这意味着 exists() 总是返回 true。第一个 if 语句正常工作。我只是使用 exists() 错误吗?

编辑: 完整代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "functions.h"
#include <QtGui/QApplication>
#include <QFileDialog>
#include <fstream>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}




// This is the function that handles the directory search when the 'browse' button is pressed
void MainWindow::on_findDir_clicked()
{
    QString path;   //declaring the path to the base directory

    path = QFileDialog::getExistingDirectory(   //gathering the directory from QFileDialog class
        this, tr("Choose the project directory"),
        "/home",
        QFileDialog::ShowDirsOnly
        | QFileDialog::DontResolveSymlinks );

    ui->baseDir->setText( path );   //setting the retrieved path into the line edit box
}



// This function makes the project by creating a new directory with name 'project_name'
// in the base directory, and collects the OpenFOAM version number and simulation type
void MainWindow::on_create_clicked()
{

    QString project_name, foam_version, full_dir, slash, base_dir;
    base_dir = ui->baseDir->text();
    project_name = ui->projectName->text();     //getting the text from the 'projectName' field
    foam_version = ui->version->currentText();  //getting the selection from the 'version' drop-down box

    //first checking if the fields have input in them:
    QString blank = "";
    QString no_text0 = "Please enter project name";
    if( project_name==no_text0 || (project_name==blank) ) {
        ui->projectName->setText( no_text0 );
        return;
    }


    QString no_text1 = "Please enter a valid directory";
    if( base_dir==no_text1 || base_dir==blank ) {
        if( !QDir( base_dir ).exists() ) {         //does base directory exist?
        ui->baseDir->setText( no_text1 );
        return;
        }
    }


    slash = "/";        // needed to separate folders in the directory (can't use a literal)
    full_dir = base_dir.append(slash.append(project_name));

    if( !QDir(full_dir).exists() )  //check if directory already exists
        QDir().mkdir(full_dir);     //creating directory

    QString blockmesh_filename, suffix;
    suffix = "_blockmesh";
    slash = "/";    //must re-define
    blockmesh_filename = full_dir.append( slash.append( project_name.append(suffix) ) );
    std::ofstream create_file( blockmesh_filename.toStdString().c_str() );  //creating empty blockmesh file

}

【问题讨论】:

  • !QDir( base_dir ).exists() ? ~ 是按位补码。
  • 哎呀,太尴尬了,我把代码放在这里的时候打错了。固定的。尽管该错误不在我的实际代码中,但该错误仍在发生。
  • 您是在变量base_dir中输入绝对路径还是相对路径
  • 绝对路径。例如:/home/mike/programs/project
  • 打印出一对' 中的base_dir 以确保它不包含任何空格、换行符等。

标签: c++ qt


【解决方案1】:

如果您在文本字段中输入任何内容,您的第二个 if 语句将不会被执行。您在第一个 if 中的逻辑表明,如果输入为空或预定义字符串,则测试目录是否存在。这意味着您始终使用空字符串或预设消息进行测试。

正确的逻辑应该是:

if( base_dir!=no_text1 && base_dir!=blank ) {
    ....

【讨论】:

  • 哦,好吧,我现在看到了。通过在第一个 if 语句中包含 exists() 条件解决了问题: if( base_dir==no_text1 || base_dir==blank || !QDir( base_dir ).exists() ) ...谢谢!
猜你喜欢
  • 2023-04-07
  • 2020-02-11
  • 1970-01-01
  • 2012-05-15
  • 2018-09-24
  • 2022-06-28
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多