我看到一些奇怪的行为,当我的Qt程序(尝试使用qt 5.5.1和7.0)的测试安装运行。在调试/开发环境中运行时,我没有注意到这个问题 - 但在安装到“Program Files(x86)”中时看到问题。Qt加载删除/重命名文件与Windows 10
问题是:我正在使用QDirIterator查找“QStandardPaths :: DataLocation”位置内的数据库文件并通过sqlite加载它们。幻影文件位于Program Files(x86)// Library/.ndat中,我看到的是来自先前安装的文件(已被删除)以及已被重命名然后删除的文件仍然显示并且是在程序中可读。这些“幻影”文件一直阻止加载最新的文件。这真的很奇怪 - 我想知道有没有人看到过这个问题?
我在基于SSD的机器上运行Windows 10 Home(如果有的话)。与Qt 5.5.1和5.7相同的问题。我已经在具有类似配置的不同机器上复制它。
任何想法?
这里是我的代码摘要:
QStringList standardPaths = QStandardPaths::locateAll(QStandardPaths::DataLocation, "Library", QStandardPaths::LocateDirectory);
QStringList fileFilters;
fileFilters << "*.ndat";
foreach (const QString &dir, standardPaths) {
QDirIterator iterator (dir, fileFilters);
while (iterator.hasNext()) {
const QString &filePath = iterator.next();
QString databaseName = QFileInfo(filePath).baseName();
database_->open(filePath, baseName); // my function
}
}
boolDataManager::open (const QString &filePath, const QString &connectionName) {
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setDatabaseName (filePath);
if (!db.open()) {
ERROR(QString("Cannot open database %1 with error %2")
.arg(QFileInfo(filePath).baseName())
.arg(db.lastError().text()));
printError();
return false;
}
databaseNames_.append(connectionName);
return true;
}
此代码似乎读取不存在了的文件 - 而奇怪的是,读取已在同一地点被覆盖旧的文件内容。它只发生在文件位于“Program Files”目录中时;不在用户目录或不是什么。
例如,我的代码版本1有一个名为“database.dat”的数据库,其中有10个条目。我的安装版本2用20个条目覆盖具有相同名称的文件的文件。我的代码版本2找到了database.dat文件,但只能读入带有10个条目的旧版本 - 真的很奇怪!
更新
看来,这些 “幽灵” 的文件存储在: C:\用户/用户名/应用程序数据/本地/ VirtualStore /程序文件(x86)/节目名称/ database.dat
我的猜测是,我打开我的程序中的文件不是只读,所以Windows在用户可写的位置创建一个工作副本。将调查。
也许您的数据库存储的旧文件名或什么造成什么吗?你可以请发布完整的代码,以便我们可以了解发生了什么。 – mike510a
“整个”代码是专有的,但让我们看看我是否可以澄清(参见上文) – Mikes
顺便说一下,您可能不应该每次打开数据库 - 您可以打开一次,然后多次写入它 – mike510a