Ну, я изменил исходные коды и исправил эту ошибку.
Path.GetTempPath()
не работает из-за среды песочницы.У него нет прав доступа.Я исправил следующие коды.И теперь это работает.
static int getTempname(int nBuf, StringBuilder zBuf)
{
const string zChars = "abcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder zRandom = new StringBuilder(20);
i64 iRandom = 0;
for (int i = 0; i < 20; i++)
{
sqlite3_randomness(1, ref iRandom);
zRandom.Append((char)zChars[(int)(iRandom % (zChars.Length - 1))]);
}
//! Modified by Toro, 2011,05,10
string tmpDir = "tmpDir";
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
store.CreateDirectory(tmpDir);
//zBuf.Append(Path.GetTempPath() + SQLITE_TEMP_FILE_PREFIX + zRandom.ToString());
zBuf.Append(tmpDir + "/" + SQLITE_TEMP_FILE_PREFIX + zRandom.ToString());
return SQLITE_OK;
}
Приведенный выше патч приведет к созданию дополнительной папки tmpDir
в изолированном хранилище, и временные файлы не будут удалены автоматически, поэтому его необходимо удалить самостоятельно.Я попытался удалить эти файлы в tmpDir
методом winClose
внутри os_win_c.cs
, и обнаружил, что это приведет к сбою при выполнении VACUUM
.Наконец, я удаляю эти файлы tmp при закрытии базы данных.Ниже приведен метод Dispose в SQLiteConnection
классе.
public void Dispose()
{
if (_open)
{
// Original codes for close sqlite database
Sqlite3.sqlite3_close(_db);
_db = null;
_open = false;
// Clear tmp files in tmpDir, added by Toro 2011,05,13
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();
string tmpDir = "tmpDir";
if (store.DirectoryExists(tmpDir) == false) return;
string searchPath = System.IO.Path.Combine(tmpDir, "*.*");
foreach (string file in store.GetFileNames(searchPath)) {
store.DeleteFile(System.IO.Path.Combine(tmpDir, file));
}
}
}