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                 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]\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 #endif
102
103                     return false;
104
105                 }
106
107             }
108
109             refChar = ‘/‘;
110
111         }
112
113     }
114
115     return true;
116
117 }

时间: 2024-10-14 09:01:34

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

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

1.sqlite在windows下的编译.配置 SQLite是一个完全独立的.不需要服务器.不要任何配置.支持SQL的.开源的文件数据库引擎.源代码和支持可以登录:http://www.sqlite.org/ 本文主要介绍如何在C++中使用sqlite. 1.SQLite下载与安装 本文以3.7.4版本为例进行说明.在http://www.sqlite.org/ 下载windows平台的3.7.4版本的sqlite.     (1)下载sqlite3.dll和sqlite3.def文件,其下载地

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

5.实现文件复制 1 int CopyFile(char *SourceFile,char *NewFile) 2 { 3 ifstream in; 4 ofstream out; 5 in.open(SourceFile,ios::binary);//打开源文件 6 if(in.fail())//打开源文件失败 7 { 8 cout<<"Error 1: Fail to open the source file."<<endl; 9 in.close(); 1

windows和linux下读取文件乱码的终极解决办法!

乱码是个很恶心的问题. windows和linux读取txt文件,一旦读取了,编码发生改变,就无法再还原了,只有重启项目. 网上有很多方法都是读取文件头,方法很好,但是亲测都不能用(右移8位判断0xff的,取3个字节的-1,-2的,大体上网上最多就这两种). 后来偶然发现一个方法,CharsetPrinter. 这个方法需要引入jar包,非常好用. public static String guessEncoding(String filename) { try { CharsetPrinter

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法

catalog 0. 引言 1. Linux平台上涉及的File IO操作 2. Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件IO操作时,可能遇到的错误,及其解决方法,主机安全攻防产品除了需要将安全攻防上的领域知识固化到程序实现上之外,还极度依赖关联系统本身.编程语言库的特性,原则上,并不是所有的安全需求都能100%地落实到程序设计中,这需要我们对操作系统.编程语言本身具有较深的理解 Relevant Link: h

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

socket在windows下和linux下的区别

windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 ------ 转载 & 修改(待整理) socket相关程序从windows移植到linux下需要注意的 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)关

MySQL在Windows和Linux下还原数据库

Linux下还原数据库代码: 1,创建一个空的数据库cddl mysql> create database cddl; Query OK, 1 row affected (0.00 sec) 2,还原数据库 [[email protected] mysqlsoftware]# cd /etc/rc.d/init.d [[email protected] mysqlsoftware]# cd /etc/rc.d/init.d [[email protected] init.d]# mysql -h

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: [cpp] view plaincopyprint? #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <string.h> #ifdef _WIN32   ///