首页 > 代码库 > 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 }
windows 与linux 下用C++读取sqlite实现文件复制(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。