可以在 ...\AppData\Local\Google\Drive\sync_config.db
文件中找到Google云端硬盘文件夹的路径,该文件是SQLITE3数据库。我的Windows C ++程序用于成功获取此数据,但最近它在我的PC和我听说过的客户上都停止了工作。数据库必须仍然有效,因为我可以使用 sqlite3
命令行实用程序打开数据库,并使用我尝试以编程方式使用的确切查询成功查询它。
如下所示代码中发生的情况是,它永远不会超过**sqlite3_prepare_v2**
,它会返回错误代码 26
。此代码通常表示该文件不是有效的数据库。那么为什么命令行实用程序会起作用呢?
任何可能改变的想法都会突然破坏这段代码?
extern CString GoogleDrivePath()
{
CString sPath = "";
CString sDbPath;
char acValue[1024];
DWORD lSize = sizeof(acValue);
struct _stat fstat;
sqlite3 *pDb;
sqlite3_stmt *pStmt;
int iSts;
char acSelect[] = "SELECT data_value FROM data WHERE entry_key = 'local_sync_root_path';";
const unsigned char *pPath;
DWORD lLen = GetEnvironmentVariable("LOCALAPPDATA", acValue, lSize);
if (lSize <= 0) return(sPath);
sDbPath = acValue;
sDbPath += "\\Google\\Drive\\sync_config.db";
if (_stat(sDbPath, &fstat) < 0) return(sPath);
iSts = sqlite3_open_v2(sDbPath, &pDb, SQLITE_OPEN_READONLY, NULL);
if (iSts) return(sPath);
iSts = sqlite3_prepare_v2(pDb, acSelect, -1, &pStmt, NULL);
if (!iSts) {
iSts = sqlite3_step(pStmt);
if (iSts == SQLITE_ROW) {
pPath = sqlite3_column_text(pStmt, 0);
if (pPath != NULL) {
sPath = pPath;
}
}
sqlite3_finalize(pStmt);
}
sqlite3_close(pDb);
return(sPath);
}
答案 0 :(得分:1)
我找到了修复程序。我的产品是用V3.6构建的并停止工作;有效的命令行实用程序实际上是V3.7。所以我用sqlite3.c V3.7.14.1重建了程序,它现在可以工作了!
显然,谷歌使用较新版本的SQLite,不知何故使数据库不向后兼容。
(由于我的程序还创建了一个随后在Android设备上使用的SQLite数据库,我有点担心更新我的版本,但它似乎工作正常。)
答案 1 :(得分:0)
命令行实用程序不会尝试以只读模式打开数据库。
试试SQLITE_OPEN_READWRITE
。
只读模式可能失败的原因有两个:数据库有热日志并需要恢复,或者您启用了WAL。