如何防止打开文件两次?

时间:2014-06-22 00:57:33

标签: c++ qt qt5

我有Mdi application 此应用程序允许在subWindow中打开文本文件 问题是你可以多次打开同一个文件。

我使用了以下不完整的代码:

QList<QMdiSubWindow*> subWindows = ui->mdiArea->subWindowList()

但我怎么知道文件是否存在。

如何防止此行为?


修改

我已经执行了以下代码,并且工作正常:(Please review the code

QList <QMdiSubWindow*> subWindows = ui -> mdiArea -> subWindowList();
if (subWindows.count() > 0) {
    for (int i = 0; i < subWindows.count(); i++) {
        if (subWindows.at(i) -> property("filePath").toString() == fileDlg) {
            return;
        }
    }
}

完整代码:

QString fileDlg = QFileDialog::getOpenFileName(this, "Open File", "F://", "Text Files(*.txt)");
if (fileDlg != "") {

    // Start the important code
    QList < QMdiSubWindow * > subWindows = ui -> mdiArea -> subWindowList();
    if (subWindows.count() > 0) {
        for (int i = 0; i < subWindows.count(); i++) {
            if (subWindows.at(i) -> property("filePath").toString() == fileDlg) {
                return;
            }
        }
    }
    // End the important code  

    QString cache;
    QFile file(fileDlg);
    if (file.open(QFile::ReadOnly)) {
        QTextStream in ( & file);
        while (!file.atEnd()) {
            cache = in .readAll();
        }
    }
    file.close();


    QFileInfo finfo(file);
    QWidget * widget = new QWidget(this);
    QTextEdit * TextEdit = new QTextEdit(widget);
    TextEdit -> setObjectName("myTextEdit");
    QMdiSubWindow * mdiWindows = ui -> mdiArea - > addSubWindow(widget);
    mdiWindows -> setProperty("filePath", fileDlg);
    mdiWindows -> setGeometry(5, 5, 300, 250);
    mdiWindows -> setWindowTitle(finfo.baseName());
    mdiWindows -> layout() -> addWidget(TextEdit);
    mdiWindows -> setWindowState(Qt::WindowMaximized);
    mdiWindows -> layout() -> setSpacing(0);
    TextEdit -> setText(cache);
    mdiWindows -> show();
}

4 个答案:

答案 0 :(得分:1)

根据操作系统的不同,同一文件可以有多个不同的名称。甚至可以用不同的方式引用相同的名称(想想遍历目录结构!)。任何纯粹基于名称的方案都必然会失败。

这样做通常非常有用,我经常打开几次相同的文件,在编辑另一个地方时查看一个地方。让用户决定。

答案 1 :(得分:0)

根据需要的示例代码:

class MdiWindow 
{
    static std::vector<std::wstring> s_filePaths;
    bool openNewFile(const std::wstring& filePath) {
        std::vector<std::wstring>::iterator iter = std::find(s_filePaths.begin(), s_filePaths.end(), filePath);
        //already opened
        if (iter != s_filePaths.end()) {
            return true;
        }
        if (openFileSucceeded(filePath)) {
            s_filePaths.push_back(filePath);
            return true;
        }
        return false;
    }
    void closeFile(const std::wstring& filePath) {
        s_filePaths.erase(s_filePaths.begin(), std::remove(s_filePaths.begin(), s_filePaths.end(), filePath));
    }
}

答案 2 :(得分:0)

没有简单的方法可以做到这一点。它通过查询内核数据结构并查看每个处理结构而具有平台相关的解决方案,这是不容易的。

但您可以在容器中打开文件,并在打开新文件时检查它的值。

容器可以是类成员,如:

QList<QString> openedFileNames;

打开文件:

if(!openedFileNames.contains(filename))
{
    openedFileNames.append(filename);

    QFile file( filename );

    if( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
        QMessageBox::warning(this, tr("Error opening!"), tr("Could not open the file"));

    ...
}

关闭文件:

openedFileNames.removeAt(openedFileNames.indexOf(filename));
file.close();

答案 3 :(得分:0)

第一次打开后,使用:

http://doc.qt.io/qt-5/qlockfile.html

在您的代码中添加:

QFile file(fileDlg);
if (file.open(QFile::ReadOnly)) {
    QTextStream in ( & file);
    while (!file.atEnd()) {
        cache = in .readAll();
    }
} else {
    //Something...
    return;
}
file.close();