zoukankan      html  css  js  c++  java
  • 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 条记录 
    ", 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
    ", SourcePath);
    20                 printf("DesPath: %s
    ", DesPath);
    21 
    22                 CheckDirectory( DesPath );
    23                 strcpy(DesPath, dbResult[index*nColumn + 2]);
    24                 if(CopyFile(SourcePath,DesPath))
    25                 {
    26                     cout<<"文件已成功复制..."<<endl;
    27                 }
    28                 else
    29                 {
    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]
    " , 
     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)]
    " , 
     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 = '';
     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]
    " , 
     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]
    " , 
     98 
     99                         __FILE__ , __LINE__ , __FUNCTION__ , iStatus , errno , strerror( errno ) );
    100 
    101 #endif
    102 
    103                     return false;
    104 
    105                 }
    106 
    107             }
    108 
    109             refChar = '/';
    110 
    111         }
    112 
    113     }
    114 
    115     return true;
    116 
    117 }
    View Code
  • 相关阅读:
    poj 1698 二分图多重匹配
    poj 3207 2-sat
    hdu4932 Miaomiao's Geometry
    hdu4924 Football Manager
    hdu4914 Linear recursive sequence
    hdoj4906 Our happy ending(2014 Multi-University Training Contest 4)
    poj1987 Distance Statistics
    poj3342 Party at Hali-Bula
    C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法
    poj1947 Rebuilding Roads
  • 原文地址:https://www.cnblogs.com/zxqdlenovo/p/4112061.html
Copyright © 2011-2022 走看看