⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filedb.cpp

📁 文件数据库文件数据库文件数据库文件数据库文件数据库文件数据库文件数据库文件数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                            NULL) ;
#endif
    if (INVALID_HANDLE_VALUE == *phDB)
    {
        OutputMsg(L"ERROR: could not open the created database!: %s\n", tszDBName);
        bRtn = FALSE;
        goto Cleanup;
    }
    else
    {
        OutputMsg(L"OK: opened database: %s\n", tszDBName);
    }
Cleanup:
    return(bRtn);
}


HANDLE OpenByName(WCHAR *szName)
{
    HANDLE hDB = INVALID_HANDLE_VALUE;
    SORTORDERSPECEX rgSortSpecs;
    CEOID DBOid = 0;
    rgSortSpecs.wVersion = SORTORDERSPECEX_VERSION;
    rgSortSpecs.wNumProps = 1;
    rgSortSpecs.wKeyFlags = 0;
    rgSortSpecs.rgPropID[0] = PROPID_NAME;
    rgSortSpecs.rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;


#ifdef EDB 
    hDB = CeOpenDatabaseInSession( hSession,
                            &m_VolGUID, 
                            &DBOid, 
                            szName, 
                            &rgSortSpecs, 
                            CEDB_AUTOINCREMENT,
                            NULL) ;

#else
    hDB = CeOpenDatabaseEx2(&m_VolGUID, 
                           &DBOid, 
                           szName, 
                           &rgSortSpecs,
                           CEDB_AUTOINCREMENT,
                           NULL) ;
#endif
    return hDB;
}


HANDLE OpenBySize(WCHAR *szName)
{
    HANDLE hDB = INVALID_HANDLE_VALUE;
    SORTORDERSPECEX rgSortSpecs;
    CEOID DBOid = 0;
    rgSortSpecs.wVersion = SORTORDERSPECEX_VERSION;
    rgSortSpecs.wNumProps = 1;
    rgSortSpecs.wKeyFlags = 0;
    rgSortSpecs.rgPropID[0] = PROPID_SIZE;
    rgSortSpecs.rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;

#ifdef EDB 
    hDB = CeOpenDatabaseInSession( hSession,
                            &m_VolGUID, 
                            &DBOid, 
                            szName, 
                            &rgSortSpecs, 
                            CEDB_AUTOINCREMENT,
                            NULL) ;

#else
    hDB = CeOpenDatabaseEx2(&m_VolGUID, 
                           &DBOid, 
                           szName, 
                           &rgSortSpecs,
                           CEDB_AUTOINCREMENT,
                           NULL) ;
#endif
    return hDB;
}

HANDLE OpenByTime(WCHAR *szName)
{
    HANDLE hDB = INVALID_HANDLE_VALUE;
    SORTORDERSPECEX rgSortSpecs;
    CEOID DBOid = 0;
    rgSortSpecs.wVersion = SORTORDERSPECEX_VERSION;
    rgSortSpecs.wNumProps = 1;
    rgSortSpecs.wKeyFlags = 0;
    rgSortSpecs.rgPropID[0] = PROPID_TIME;
    rgSortSpecs.rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;
#ifdef EDB 
    hDB = CeOpenDatabaseInSession( hSession,
                            &m_VolGUID, 
                            &DBOid, 
                            szName, 
                            &rgSortSpecs, 
                            CEDB_AUTOINCREMENT,
                            NULL) ;

#else
    hDB = CeOpenDatabaseEx2(&m_VolGUID, 
                           &DBOid, 
                           szName, 
                           &rgSortSpecs,
                           CEDB_AUTOINCREMENT,
                           NULL) ;
#endif
    return hDB;
}
BOOL DumpDB(HANDLE hDB)
{
    CEOID oidRecord;
    CEPROPVAL*pRecord = NULL;
    WORD   wNumProps;
    DWORD  dwBufSize = 0;
    TCHAR szName[MAX_PATH];
    DWORD dwSize = 0;
    DWORD dwAttr = 0;
    FILETIME ft;
    SYSTEMTIME st;
    oidRecord = CeSeekDatabaseEx(hDB, CEDB_SEEK_BEGINNING, 0, 0, 0);
    if (!oidRecord) {
        OutputMsg(L"DumPDB: Couldn't seek to beginning of DB!");
        return FALSE;
    }
    WORD i;
#ifdef EDB 
    while (oidRecord = CeReadRecordPropsEx(hDB, CEDB_ALLOWREALLOC, &wNumProps, NULL, (LPBYTE *)&pRecord, &dwBufSize, NULL)) {
#else
    while (oidRecord = CeReadRecordProps(hDB, CEDB_ALLOWREALLOC, &wNumProps, NULL, (LPBYTE *)&pRecord, &dwBufSize)) {
#endif

        TestOids(&m_VolGUID, oidRecord);
        for (i = 0; i < wNumProps; i++) {
            switch(pRecord[i    ].propid) {
                case PROPID_NAME:
                    wcscpy( szName, pRecord[i].val.lpwstr);
                    break;
                case PROPID_TIME:
                    ft = pRecord[i].val.filetime;
                    break;
                case PROPID_ATTR:
                    dwAttr = pRecord[i].val.uiVal;
                    break;
                case PROPID_SIZE:
                    dwSize = pRecord[i].val.uiVal;
                    break;
                default:
                    OutputMsg(L"Unknown propid !!!!\r\n");
                    DebugBreak();
                    break;
            }
        }
        FileTimeToSystemTime(&ft, &st);
        OutputMsg(L"%30s %10ld %02d/%02d/%02d %02d:%02d %c%c%c\r\n",
            szName,
            dwSize,
            st.wMonth, st.wDay, st.wYear,
            st.wHour, st.wMinute,
            dwAttr & FILE_ATTRIBUTE_DIRECTORY ? L'D' : L' ',
            dwAttr & FILE_ATTRIBUTE_SYSTEM ? L'S' : L' ',
            dwAttr & FILE_ATTRIBUTE_HIDDEN ? L'H' : L' ');
    }

    LocalFree(pRecord);
    return TRUE;
}

//
// Sorts the database using a specific locale.
//
BOOL TestDatabaseSortLCID(LPWSTR lpLocaleString)
{
    LPWSTR pszTmp;
    DWORD dwLCID = wcstoul(lpLocaleString, &pszTmp, 16);
    HANDLE hDB = INVALID_HANDLE_VALUE;

    OutputMsg( L"Setting LCID=%08X\r\n", dwLCID); 

    // has no return value-- assume success
    //
    CeChangeDatabaseLCID(&m_VolGUID, dwLCID);
    
    // string sort
    hDB = OpenByName(pszDBName);

    OutputMsg( L"Sorting by name\r\n");
    OutputMsg( L"--------------------------------------------------------\r\n");

    if (!DumpDB(hDB)) {
        OutputMsg(L"ERROR: could not dump the database!!\n"); 
        goto Cleanup;
    }

    CloseHandle(hDB);

    // dword sort
    hDB = OpenBySize(pszDBName);

    OutputMsg( L"Sorting by size\r\n");
    OutputMsg( L"----------------------------------------------------------\r\n");
    if (!DumpDB(hDB)) {
        OutputMsg(L"ERROR: could not dump the database!!\n"); 
        goto Cleanup;
    }
    CloseHandle(hDB);

    // file time sort
    hDB = OpenByTime(pszDBName);
    OutputMsg( L"Sorting by time\r\n");
    OutputMsg( L"----------------------------------------------------------\r\n");

    if (!DumpDB(hDB)) {
        OutputMsg(L"ERROR: could not dump the database!!\n"); 
        goto Cleanup;
    }

    CloseHandle(hDB);
    hDB = INVALID_HANDLE_VALUE;

    return TRUE;
    
Cleanup:    
    // Close the database if still open
    if(INVALID_HANDLE_VALUE != hDB)
    {
        CloseHandle(hDB);
    }

    return FALSE;
}


//
// Main entry point.
//
BOOL WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR lpCmdLine,
                   int nCmdShow)
{
    HANDLE hDB = INVALID_HANDLE_VALUE;

    //
    // 1. Verify condition of exising Volume - this is where we detect 
    // corruption. CreateDB (or Mount)
    if(! CreateDB(&hDB, pszDBName))
    {
        goto Cleanup;
    }


    //
    // 2. Create Table & Add records
    if(! PopulateDB(hDB, FALSE))
    {
        OutputMsg(L"ERROR: could not populate the database!!\n"); 
        goto Cleanup;
    }


    //
    // 3. Flush baseline Database: schema + data - this must always pass
    if(! CeFlushDBVol(&m_VolGUID))
    {
        OutputMsg(L"ERROR: could not flush baseline database scheema!: %d\n", GetLastError());
        goto Cleanup;
    }

    CloseHandle(hDB);
    hDB = INVALID_HANDLE_VALUE;

    //
    // 4. Call EnumSystemLocales using "0409" LOCALE.
    LPWSTR lpLocale = L"0409\0";
    TestDatabaseSortLCID(lpLocale);

Cleanup:   

#ifdef EDB 
    // Close the session if still open
    if(INVALID_HANDLE_VALUE != hSession)
    {
        CloseHandle(hSession);
    }
#endif

    // Close the database if still open
    if(INVALID_HANDLE_VALUE != hDB)
    {
        CloseHandle(hDB);
    }

    return(FALSE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -