首页 > 代码库 > windows 与linux 下用C++读取sqlite实现文件复制(二)

windows 与linux 下用C++读取sqlite实现文件复制(二)

2.分别查询读取sqlite表中的字段。

 1 //在数据库中查询表: 2     // 执行SQL  3     char **dbResult; //是 char ** 类型,两个*号 4     int nRow, nColumn; 5     sprintf(sql, "select * from test1"); 6     int result = sqlite3_get_table( conndb, sql, &dbResult, &nRow, &nColumn, &err_msg ); 7     if( SQLITE_OK == result )//查询成功 8     { 9         if ( dbResult != 0)10         {11             for (int index = 1; index <= nRow; index++)12             {    13                 printf( "第 %d 条记录 \n", index );14                 if (nColumn != 3)15                     return -1;16                 char  SourcePath[256], DesPath[256];  17                 strcpy(SourcePath, dbResult[index*nColumn  + 1]);18                 strcpy(DesPath, dbResult[index*nColumn + 2]);19                 printf("SourcePath: %s\n", SourcePath);20                 printf("DesPath: %s\n", DesPath);21 22                 CheckDirectory( DesPath );23                 strcpy(DesPath, dbResult[index*nColumn + 2]);24                 if(CopyFile(SourcePath,DesPath))25                 {26                     cout<<"文件已成功复制..."<<endl;27                 }28                 else29                 {30                     cout<<"文件复制失败..."<<endl;31                 }32 33 34                 sprintf(sql ,"update test1 set des=src where id =%d", index);35                 int bRet = sqlite3_exec(conndb, sql,NULL,NULL,&err_msg);36                 /* 如果执行成功,则删除记录 */37                 if (bRet == SQLITE_OK)38                 {39                     sprintf(sql, "delete from test1 where id =%d", index);40                     sqlite3_exec(conndb, sql, NULL, NULL, &err_msg);41                 }42             }43         }44 45     }else//查询失败46     {47         Sleep(100000);  48     }49     //到这里,不论数据库查询是否成功,都释放 char** 查询结果,使用 sqlite 提供的功能来释放50     sqlite3_free_table( dbResult );    

3.检查目标路径是否存在,不存在则创建。linux和windows下都可以用该函数

 1 // 遍历目录 2 bool CheckDirectory( char* pszPath ) 3 { 4     vector< std::string > vtPath; 5  6     const char* sep = "\/"; 7     char* next_token; 8     char* token =  strtok_s( pszPath, sep, &next_token); 9     while( token != NULL )10     {11         vtPath.push_back( token );12         token = strtok_s(NULL, sep, &next_token);13     }14 15     if ( vtPath.size() > 0 )16     {17         if ( vtPath[0] == "." )18             vtPath.erase( vtPath.begin() );19     }20 21     // 核查所有路径是否存在22     std::string strCurPath;23     for( size_t i = 0; i  < (int)vtPath.size(); ++i )24     {25 26 27         //cout << vtPath[i] << endl;28 29         if (i==0)30         {31             strCurPath += vtPath[i];32         }33         else if (i < (int)vtPath.size()-1)34         {35             strCurPath +=\/;36             strCurPath += vtPath[i];37 38 39         }40         if ( !CreateDirectory(strCurPath.c_str(),777))41         {42             return false;43         }44 45     }46     strCurPath +=\/;47     strCurPath += vtPath[(int)vtPath.size()-1];48     if( !isExistFile(strCurPath.c_str()))49     {50         return false;51     }52 53     return true;54 }

4.生成目录

/*!

以指定的权限创建目录.

对于指定要创建的目录,如果其父目录不存在(递归至要生成的目标上报的根目录),那么会创建其对应的父目录

例如,指定要创建的目录: "/foo/bar",如果/foo/目录不存在,那么在创建 bar 目录之前会创建 /foo 目录

对于要生成的目标目录,"./foo/bar" 等价于 "foo/bar"

@param szDirectoryPath 要创建的目录的路径

@param iDirPermission 创建目录时,为所创建的目录所指定的权限

@return 如果创建成功,返回<b>true</b>;如果创建失败,返回<b>false</b>.

*/

  1 static bool CreateDirectory( const char *szDirectoryPath , int iDirPermission )  2   3 {  4   5     if ( NULL == szDirectoryPath )  6   7     {  8   9 #ifdef DEBUG 10  11         fprintf( stderr , "[%s][%d][%s][parameter < szDirectoryPath > for < CreateDirectory > should not be NULL]\n" ,  12  13             __FILE__ , __LINE__ , __FUNCTION__ ); 14  15 #endif 16  17         return false; 18  19     } 20  21     const int iPathLength = static_cast< int >( strlen( szDirectoryPath ) ); 22  23     if ( iPathLength > PATH_MAX ) 24  25     { 26  27 #ifdef DEBUG 28  29         fprintf( stderr , "[%s][%d][%s][the path length(%d) exceeds system max path length(%d)]\n" ,  30  31             __FILE__ , __LINE__ , __FUNCTION__ , iPathLength , PATH_MAX ); 32  33 #endif 34  35         return false; 36  37     } 38  39     char szPathBuffer[ PATH_MAX ] = { 0 }; 40  41     memcpy( szPathBuffer , szDirectoryPath , iPathLength ); 42  43     for ( int i = 0 ; i < iPathLength ; ++i ) 44  45     { 46  47         char &refChar = szPathBuffer[ i ]; 48  49         //目录分隔符 50  51         if ( ( / == refChar ) && ( 0 != i ) ) 52  53         { 54  55             refChar = \0; 56  57             //判断当前目录是否存在 58  59             int iStatus = access( szPathBuffer , F_OK ); 60  61             if ( 0 != iStatus ) 62  63             { 64  65                 if ( ( ENOTDIR == errno ) || ( ENOENT == errno ) ) 66  67                 { 68  69                     //以指定权限创建目录 70  71                     iStatus = mkdir( szPathBuffer , iDirPermission ); 72  73                     if ( 0 != iStatus ) 74  75                     { 76  77 #ifdef DEBUG 78  79                         fprintf( stderr , "[%s][%d][%s][< mkdir > fail , ErrCode:%d , ErrMsg:%s]\n" ,  80  81                             __FILE__ , __LINE__ , __FUNCTION__ , errno , strerror( errno ) ); 82  83 #endif 84  85                         return false; 86  87                     } 88  89                 } 90  91                 else 92  93                 { 94  95 #ifdef DEBUG 96  97                     fprintf( stderr , "[%s][%d][%s][< access > fail , RetCode: %d , ErrCode:%d , ErrMsg:%s]\n" ,  98  99                         __FILE__ , __LINE__ , __FUNCTION__ , iStatus , errno , strerror( errno ) );100 101 #endif102 103                     return false;104 105                 }106 107             }108 109             refChar = /;110 111         }112 113     }114 115     return true;116 117 }
View Code

 

windows 与linux 下用C++读取sqlite实现文件复制(二)