一些可公布的工具类代码
tool.h
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
# pragma once
#ifndef _TOOL_H
#define _TOOL_H
//bizware kkf2
#define IP "10.0.0.0" //在一台计算机上测试,IP为本地回送地址
#define PORT 48018 //注意:客户端设置通信的端口 = 服务端的端口
//FTP
#define S_FTPUSER "UUU"
#define S_FTPPWD "******"
#define S_REMOTE_DIR "/home/weblogic/download"
#define S_DOWNLOAD_LOCALHOST_PATH "E:\\FTP\\" //需在E盘创建 FTP 文件夹
//DB Oracle
#define DB_USERNAME "XXX";
#define DB_PASSWORD "******";
#define DB_IP "10.0.0.0";
#define DB_PORT "1521";
#define DB_SID "orcl";
//打印日志
void __stdcall T_SaveLog_KF(const char *LogBuff);
//打印日志
void __stdcall Fprintf_Log(const char *LogBuff);
int __stdcall GetTime_My(char *buf);
//按行读取整个文件
int __stdcall ReadFile(const char *path, char * pRead);
//读取文件几行
int __stdcall Read_File_Rows(FILE *fp, char * pReadBuf, long startRow, long rows);
//Ftp下载文件
void FtpDownLoadFile(char* address, char* username, char* password, char* ftp_path, char* remote_file_name, char* local_path_file);
//Ftp下载文件 char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
void FtpDownLoadFile(char* address, char* username, char* password, char* ftp_path, char* remote_file_name, char* local_path_file, char* flag_Tips);
//上传文件
void FtpUpLoadFile();
//删除磁盘文件
int remove_disk_file(const char* Path);
//删除磁盘文件 char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
int remove_disk_file(const char* Path, char* flag_Tips);
//转换成大写
char * charToUPs(char* base);
//连接oracle 数据库
bool connect_oracl();
//关闭连接oracle 数据库
bool adoclose();
//执行sql
_RecordsetPtr AdoExucute(char* sqlStr);
//获取结果集
void getRecordResult(_RecordsetPtr PRecord);
/********************************
根据英文分号打断sql 逐条执行
********************************/
int AdoExucuteByList(char* pReadBuf);
//int __stdcall ReadSqlFile(const char *path_file, char * pReadBuf, char * line_notes_flag); //读取文件所有内容并舍弃包含标识的行数据
//读取文件所有内容并将包含标识的行数据 从标识处接断舍弃
int __stdcall ReadSqlFileTok(const char *path_file, char * pReadBuf, char *line_notes_flag);
//读取文件所有内容并将包含标识的行数据 从标识处接断舍弃 char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
int __stdcall ReadSqlFileTok(const char *path_file, char * pReadBuf, char *line_notes_flag, char* flag_Tips);
//获取选择文件路径
const CString chose_file_path();
int socket_send(CString jsons, char *rcv_show);
//发送字符串到服务器 char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
int socket_send(CString jsons, char *rcv_show, char* flag_Tips);
//读取文件内容返回查找的数据行 可返回多行数据
char* __stdcall ReadFileSearch(const char* path_file, char* pReadBuf, char* search_srting);
//读取文件内容返回查找的数据行 可返回多行数据 char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
char* __stdcall ReadFileSearch(const char* path_file, char* pReadBuf, char* search_srting, char* flag_Tips);
//替换字符串
char* str_replace(char* str, const char *oldstr, const char *newstr);
//判断文件路径是否存在 或者权限_access();
int file_exists(const char *PATH, int iMode);
//判断参数是否是数字组成
bool IsNumber(const char* input);
//判断参数是否是数字组成
bool IsNumber2(const char* input);
//统计字符串出现次数
long Count_String(const char * Original_Str, const char * Finded_Str);
//统计字符出现次数
long Count_Char(const char * Original_Str, int C);
//获取windows系统进程号 线程号
CString Get_PID_UPD_AfxMessageBox(char * msg_Tips);
/**********************************************************************
拼接sql字符串
char* key_value[][2]
/**********************************************************************/
char* sqladd(char* key_value[][2], char* add_sql);
/**********************************************************************
字符串转数字 long double
**********************************************************************/
long double Atolongdouble(char* a);
char* AtolongdoubleX100(char* A);
//复制到剪切板
void CopyCStringToClipboard(CString str);
/**************************************
将整个文件复制到剪贴板,注意是文件不是文本内容
CopyFileToClipboard("D:\\user.txt");
**************************************/
int CopyFileToClipboard(char szFileName[]);
#endif
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
tool.cpp
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#pragma once
#include"stdafx.h"
#include "sys/stat.h"
#include "tools.h"
//#define IP "8.8.8.8" //在一台计算机上测试,IP为本地回送地址
//#define PORT 80 //注意:客户端设置通信的端口 = 服务端的端口
//#pragma warning(suppress : 4996)
#pragma warning(disable : 4996)
#define LOG_FILES_MAX_SIZE 500*1024*1024 //100M
#define T_LOG_XC
#define LOG_NAME1 "./SQLOG.text"
void __stdcall T_SaveLog_KF(const char *LogBuff) //打印日志
{
#if defined(T_LOG_XC)
FILE *fp = NULL;
struct stat buf;
int iRet = stat(LOG_NAME1, &buf);
if (iRet == 0)
{
if (buf.st_size > LOG_FILES_MAX_SIZE)
{
remove(LOG_NAME1);
}
}
fp = fopen(LOG_NAME1, "a+");
if (fp == NULL)
{
return;
}
char cTimeBuf[20] = "";
GetTime_My(cTimeBuf); //获取时间
fprintf(fp, "时间 %s ", cTimeBuf);
fprintf(fp, "%s\n", LogBuff);
fclose(fp);
if (fp) {
fclose(fp);
}
#endif
return;
}
#define T_LOG_XC
#define LOG_NAME "./Log_printf.text"
void __stdcall Fprintf_Log(const char *LogBuff) //打印日志 保存内容为ANSI
{
#if defined(T_LOG_XC)
FILE *fp = NULL;
struct stat buf;
int iRet = stat(LOG_NAME, &buf);
if (iRet == 0)
{
if (buf.st_size > LOG_FILES_MAX_SIZE)
{
remove(LOG_NAME);
}
}
fp = fopen(LOG_NAME, "a+");
if (fp == NULL)
{
return;
}
char cTimeBuf[20] = "";
GetTime_My(cTimeBuf); //获取时间
fprintf(fp, "时间 %s ", cTimeBuf);
fprintf(fp, "%s\n", LogBuff);
fclose(fp);
if (fp) {
fclose(fp);
}
#endif
return;
}
/*
buf[20]
*/
int __stdcall GetTime_My(char *buf)
{
// LPSYSTEMTIME systime;
// GetCurrentTime()
SYSTEMTIME SysTime, SysTime2;
GetSystemTime(&SysTime);
GetLocalTime(&SysTime2);
memset(buf, 0, 20);
sprintf(buf, (const char *)"%d-%02d%02d %02d:%02d:%02d", (unsigned int)SysTime.wYear, (unsigned int)SysTime.wMonth, (unsigned int)SysTime.wDay, (unsigned int)SysTime.wHour + 8, (unsigned int)SysTime.wMinute, (unsigned int)SysTime.wSecond);
return 0;
}
/**
读取文件
**/
#include "stdio.h"
#define SQL_INFO_FILE "./SQL_INFO_FILE.text"
int __stdcall ReadFile(const char *path, char * pReadBuf)
{
FILE *fp = NULL;
char str[BUFSIZ * 5];
if ((fp = fopen(SQL_INFO_FILE, "r")) == NULL) {
printf("cannot open file/n"); exit(1);
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
printf("%s", str);
strcat(pReadBuf, str);
}
}
fclose(fp);
return 0;
}
/**
读取文件一行数据
*fp 文件指针
startRow 起始行
rows 读取行数
**/
int __stdcall Read_File_Rows(FILE *fp, char * pReadBuf, long startRow, long rows)
{
char str[BUFSIZ];
long count = 0L;
if (!fp)
{
Fprintf_Log("文件指针为空!不能读取一行数据");
return -1;
}
while (!feof(fp)) {
if (count = fgets(str, sizeof(str), fp) != NULL) { //读取一行数据
printf("%s", str);
//pReadBuf = *pReadBuf + str;
strcat(pReadBuf, str);
}
}
fclose(fp);
return 0;
}
#include <winsock2.h>
#include <winsock.h>
#include <stdio.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库
int socket(CString jsons)
{
#define BUFFER_SIZE BUFSIZ*20 //数据发送缓冲区大小
//struct hostent *pURL=NULL;
char rcvBuf[BUFFER_SIZE]; //buf数组存放客户端发送的消息
char* sndBuf = "000109{\"busiid\":\"XXXX\"}";//buf数组存放客户端发送的消息
char * tempBuf = NULL;
if (!jsons.IsEmpty()) {
tempBuf = (char*)(LPCTSTR)(jsons);
long jsonLen = strlen(tempBuf);
char buffer[BUFFER_SIZE] = { '\0' };
sprintf_s(buffer, sizeof(buffer), "%06d%s", jsonLen, tempBuf);
sndBuf = buffer;
}
//用于输入字符自增变量
int i = 0;
while (i < 3)
{
i++;
printf("C:\\Socket\\Client>");
memset(rcvBuf, '\0', sizeof(rcvBuf));
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
continue;
}
/*
* windows下使用socket必须用WSAStartup初始化,否则不能调用
*/
if (WSAStartup(MAKEWORD(2, 2), &WSAData)) //加载socket 2.2通讯协议库
{
printf("WSA failed\n");
return -1;
}
//socket(PF_INET, SOCK_STREAM, 0); //建立socket通讯
SOCKET sock; //客户端进程创建套接字
//if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)TCP 方式连接
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)
{
printf("Socket create fail!\n");
WSACleanup();
continue;
}
int nNetTimeout = 60000 * 5; //60*3秒
//发送时限
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
//接收时限
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
#pragma warning(disable : 4996)
struct hostent* host_addr = gethostbyname(IP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)PORT);
sin.sin_addr.s_addr = *((unsigned long*)*host_addr->h_addr_list);
if (connect(sock, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //调用connect()函数,向服务器进程发出连接请求
{
printf("Connect fail!\n");
closesocket(sock);
WSACleanup();
continue;
}
int ret = send(sock, sndBuf, BUFFER_SIZE, 0); //向服务器发送数据
ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
if (ret > 0 && strlen(rcvBuf) > 0) {
CString strMsg;
strMsg.Format(_T("发送信息:%s\n返回信息:\n %s"), sndBuf, rcvBuf);
AfxMessageBox(strMsg);
}
//ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源
return 0;
}
return 0;
}
int socket_send(CString jsons, char *rcv_show)
{
memset(rcv_show, '\0', sizeof(rcv_show));
char rcvBuf[BUFFER_SIZE]; //buf数组存放客户端发送的消息
char* sndBuf = "000109{\"busiid\":\"XXXX\"}}";//buf数组存放客户端发送的消息
char * tempBuf = NULL;
if (!jsons.IsEmpty()) {
tempBuf = (char*)(LPCTSTR)(jsons);
long jsonLen = strlen(tempBuf);
char buffer[BUFFER_SIZE] = { '\0' };
sprintf_s(buffer, sizeof(buffer), "%06d%s", jsonLen, tempBuf);
sndBuf = buffer;
}
char check_tran_code[][50] = { "\"tran_code\":\"201\"","\"tran_code\":\"202\"","\"tran_code\":\"20408\"","\"tran_code\":\"20402s\"","\"tran_code\":\"20403s\"","\"tran_code\":\"20402S\"","\"tran_code\":\"20403S\"" };
size_t length = sizeof(check_tran_code) / sizeof(check_tran_code[0]); // 数组长度对于其他类型的数组,都可以用字符数组的第三种方
for (size_t i = 0; i < length; i++)
{
if (strstr(sndBuf, check_tran_code[i])) {
CString strMsg;
strMsg.Format(_T("选择是否发送执行?\nIP [ %s:%d ]\n发送消息: %s\n"), IP, PORT, (LPCTSTR)sndBuf);
if (IDNO == AfxMessageBox(strMsg, MB_YESNO)) {
AfxMessageBox("结束执行!");
return -2;
}
}
}
//用于输入字符自增变量
int i = 0;
while (i < 3)
{
i++;
printf("C:\\Socket\\Client>");
memset(rcvBuf, '\0', sizeof(rcvBuf));
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
continue;
}
/*
* windows下使用socket必须用WSAStartup初始化,否则不能调用
*/
if (WSAStartup(MAKEWORD(2, 2), &WSAData)) //加载socket 2.2通讯协议库
{
printf("WSA failed\n");
return -1;
}
//socket(PF_INET, SOCK_STREAM, 0); //建立socket通讯
SOCKET sock; //客户端进程创建套接字
//if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)TCP 方式连接
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)
{
printf("Socket create fail!\n");
WSACleanup();
continue;
}
int nNetTimeout = 60000 * 5; //60*3秒
//发送时限
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
//接收时限
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
#pragma warning(disable : 4996)
struct hostent* host_addr = gethostbyname(IP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)PORT);
sin.sin_addr.s_addr = *((unsigned long*)*host_addr->h_addr_list);
if (connect(sock, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //调用connect()函数,向服务器进程发出连接请求
{
printf("Connect fail!\n");
closesocket(sock);
WSACleanup();
continue;
}
int ret = send(sock, sndBuf, BUFFER_SIZE, 0); //向服务器发送数据
//循环读取
ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
if (strlen(rcvBuf) > 0) {
CString strMsg;
strMsg.Format(_T("发送[ %s:%d ]信息:%s\n返回信息:\n %s"), IP, PORT, sndBuf, rcvBuf);
Fprintf_Log(strMsg);
AfxMessageBox(strMsg);
memcpy(rcv_show, rcvBuf, strlen(rcvBuf));
}
//ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
return 0;
}
return 0;
}
// char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
int socket_send_back(CString jsons, char *rcv_show, char* flag_Tips)
{
//#define BUFFER_SIZE 1024*5 //数据发送缓冲区大小
//struct hostent *pURL=NULL;
memset(rcv_show, '\0', sizeof(rcv_show));
char rcvBuf[BUFFER_SIZE]; //buf数组存放客户端发送的消息
char* sndBuf = "000109{\"busiid\":\"XXXX\"}}";//buf数组存放客户端发送的消息
char * tempBuf = NULL;
if (!jsons.IsEmpty()) {
tempBuf = (char*)(LPCTSTR)(jsons);
long jsonLen = strlen(tempBuf);
char buffer[BUFFER_SIZE] = { '\0' };
sprintf_s(buffer, sizeof(buffer), "%06d%s", jsonLen, tempBuf);
sndBuf = buffer;
}
char check_tran_code[][50] = {"\"tran_code\":\"201\"","\"tran_code\":\"202\"","\"tran_code\":\"20408\"","\"tran_code\":\"20402s\"","\"tran_code\":\"20403s\"","\"tran_code\":\"20402S\"","\"tran_code\":\"20403S\"" };
size_t length = sizeof(check_tran_code) / sizeof(check_tran_code[0]); // 数组长度对于其他类型的数组,都可以用字符数组的第三种方
for (size_t i = 0; i < length; i++)
{
if (strstr(sndBuf, check_tran_code[i])) {
int j = 3;
while (j--) {
CString strMsg;
strMsg.Format(_T("资金交易选择是否发送执行?还需要%d次确认!\nIP [ %s:%d ]\n发送消息: %s\n"), j,IP, PORT, (LPCTSTR)sndBuf);
if (IDNO == AfxMessageBox(strMsg, MB_YESNO)) {
AfxMessageBox("结束执行!");
return -2;
}
}
Sleep(1000);
}
}
//用于输入字符自增变量
int i = 0;
while (i < 2)
{
i++;
printf("C:\\Socket\\Client>");
memset(rcvBuf, '\0', sizeof(rcvBuf));
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
continue;
}
/*
* windows下使用socket必须用WSAStartup初始化,否则不能调用
*/
if (WSAStartup(MAKEWORD(2, 2), &WSAData)) //加载socket 2.2通讯协议库
{
printf("WSA failed\n");
return -1;
}
//socket(PF_INET, SOCK_STREAM, 0); //建立socket通讯
SOCKET sock; //客户端进程创建套接字
//if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)TCP 方式连接
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)
{
printf("Socket create fail!\n");
WSACleanup();
continue;
}
int nNetTimeout = 60000 * 5; //60*3秒
//发送时限
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
//接收时限
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
#pragma warning(disable : 4996)
struct hostent* host_addr = gethostbyname(IP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)PORT);
sin.sin_addr.s_addr = *((unsigned long*)*host_addr->h_addr_list);
if (connect(sock, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //调用connect()函数,向服务器进程发出连接请求
{
printf("Connect fail!\n");
closesocket(sock);
WSACleanup();
continue;
}
int ret = send(sock, sndBuf, strlen(sndBuf) + 1, 0); //向服务器发送数据
//循环读取
ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
if (strlen(rcvBuf) > 0) {
CString strMsg;
strMsg.Format(_T("发送[ %s:%d ]信息:%s\n返回信息:\n %s"), IP, PORT, sndBuf, rcvBuf);
Fprintf_Log(strMsg);
if (strcmp(flag_Tips, "FALSE") != 0) { //flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
AfxMessageBox(strMsg);
}
memcpy(rcv_show, rcvBuf, strlen(rcvBuf));
}
//ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
return 0;
}
return 0;
}
// char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
int socket_send(CString jsons, char *rcv_show, char* flag_Tips)
{
//#define BUFFER_SIZE 1024*5 //数据发送缓冲区大小
//struct hostent *pURL=NULL;
memset(rcv_show, '\0', sizeof(rcv_show));
char rcvBuf[BUFFER_SIZE]; //buf数组存放客户端发送的消息
char* sndBuf = "000109{\"busiid\":\"XXXX\"}}";//buf数组存放客户端发送的消息
char * tempBuf = NULL;
if (!jsons.IsEmpty()) {
tempBuf = (char*)(LPCTSTR)(jsons);
long jsonLen = strlen(tempBuf);
char buffer[BUFFER_SIZE] = { '\0' };
sprintf_s(buffer, sizeof(buffer), "%06d%s", jsonLen, tempBuf);
sndBuf = buffer;
}
char check_tran_code[][50] = { "\"tran_code\":\"201\"","\"tran_code\":\"202\"","\"tran_code\":\"20408\"","\"tran_code\":\"20402s\"","\"tran_code\":\"20403s\"","\"tran_code\":\"20402S\"","\"tran_code\":\"20403S\"" };
size_t length = sizeof(check_tran_code) / sizeof(check_tran_code[0]); // 数组长度对于其他类型的数组,都可以用字符数组的第三种方
for (size_t i = 0; i < length; i++)
{
if (strstr(sndBuf, check_tran_code[i])) {
int j = 3;
while (j--) {
CString strMsg;
strMsg.Format(_T("资金交易选择是否发送执行?还需要%d次确认!\nIP [ %s:%d ]\n发送消息: %s\n"), j, IP, PORT, (LPCTSTR)sndBuf);
if (IDNO == AfxMessageBox(strMsg, MB_YESNO)) {
AfxMessageBox("结束执行!");
return -2;
}
}
Sleep(500);
}
}
Sleep(1000);
//用于输入字符自增变量
int i = 0;
while (i < 2)
{
i++;
printf("C:\\Socket\\Client>");
memset(rcvBuf, '\0', sizeof(rcvBuf));
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) == SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
continue;
}
/*
* windows下使用socket必须用WSAStartup初始化,否则不能调用
*/
if (WSAStartup(MAKEWORD(2, 2), &WSAData)) //加载socket 2.2通讯协议库
{
printf("WSA failed\n");
return -1;
}
//socket(PF_INET, SOCK_STREAM, 0); //建立socket通讯
SOCKET sock; //客户端进程创建套接字
//if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)TCP 方式连接
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) //创建流套接字(与服务端保持一致)
{
printf("Socket create fail!\n");
WSACleanup();
continue;
}
int nNetTimeout = 60000 * 5; //60*3秒
//发送时限
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
//接收时限
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
try
{
#pragma warning(disable : 4996)
struct hostent* host_addr = gethostbyname(IP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)PORT);
sin.sin_addr.s_addr = *((unsigned long*)*host_addr->h_addr_list);
if (connect(sock, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) //调用connect()函数,向服务器进程发出连接请求
{
printf("Connect fail!\n");
closesocket(sock);
WSACleanup();
continue;
}
int ret = send(sock, sndBuf, strlen(sndBuf) + 1, 0); //向服务器发送数据
if (ret <= 0)
{
CString strMsg;
int error = WSAGetLastError();
strMsg.Format(("发送套接字异常,请重试 错误码=[%d]", error));
AfxMessageBox(_T(strMsg));
}
//循环读取
ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
if (strlen(rcvBuf) > 0) {
CString strMsg;
strMsg.Format(_T("发送[ %s:%d ]信息:%s\n返回信息:\n %s"), IP, PORT, sndBuf, rcvBuf);
Fprintf_Log(strMsg);
if (strcmp(flag_Tips, "FALSE") != 0) { //flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
AfxMessageBox(strMsg);
}
memcpy(rcv_show, rcvBuf, strlen(rcvBuf));
}
if (ret <= 0)
{
CString strMsg;
strMsg.Format(_T("连接异常,可能超时!!!"));
AfxMessageBox(strMsg);
Fprintf_Log(strMsg);
}
//ret = recv(sock, rcvBuf, sizeof(rcvBuf), 0);
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
return 0;
}
catch (...)
{
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
AfxMessageBox(_T("socket捕获异常,可能超时..."));
}
}
return 0;
}
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include <process.h>
#include <afxinet.h>
#pragma comment(lib, "WININET.LIB")
void FtpDownLoadFile_test()
{
// TODO: Add your control notification handler code here
CInternetSession * pInternetSession = NULL;
CFtpConnection * pFtpConnection = NULL;
//建立连接
pInternetSession = new CInternetSession(AfxGetAppName());
//服务器的ip地址
CString strADddress = IP;
//用户名与密码
CString strUserName = S_FTPUSER;
CString strPwd = S_FTPPWD;
//服务器的目录
CString strDir = "/home/bizware/download"; //服务器中的Image目录下
//若要设置为服务器的根目录,则使用"\\"就可以了
//创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了
pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd, 21);
//设置服务器的目录
bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir);
if (bRetVal == false)
{
AfxMessageBox("目录设置失败");
return;
}
else
{
//把服务器002jpg下载到E盘
CString strLocalFile = "E:\\88109924099901100353_20190103_20190103.txt";
CString strRemoteFile = "88109924099901100353_20190103_20190103.txt";
BOOL ret = pFtpConnection->GetFile(strRemoteFile, strLocalFile);
if (ret)
{
AfxMessageBox(_T("文件下载成功"));
}
}
//释放资源
if (NULL != pFtpConnection)
{
pFtpConnection->Close();
delete pFtpConnection;
pFtpConnection = NULL;
}
if (NULL != pInternetSession)
{
delete pInternetSession;
pInternetSession = NULL;
}
}
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include <process.h>
#include <afxinet.h>
#pragma comment(lib, "WININET.LIB")
/*
char* address IP
char* username 用户
char* password 密码
char* ftp_path 远程路径
char* remote_file_name 远程文件名
char* local_path_file 本地文件目录
*/
void FtpDownLoadFile(char* address, char* username, char* password, char* ftp_path, char* remote_file_name, char* local_path_file)
{
// TODO: Add your control notification handler code here
CInternetSession * pInternetSession = NULL;
CFtpConnection * pFtpConnection = NULL;
//建立STP/SFTP连接 CInternetSession
pInternetSession = new CInternetSession(AfxGetAppName());
//服务器的ip地址
CString strADddress = CString(address);
//用户名与密码
CString strUserName = CString(username);
CString strPwd = CString(password);
//服务器的目录
CString strDir = CString(ftp_path); //服务器中的Image目录下
//若要设置为服务器的根目录,则使用"\\"就可以了
//创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了
pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd, 21);
//设置服务器的目录
bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir);
if (bRetVal == false)
{
AfxMessageBox("FTP 目录设置失败");
return;
}
else
{
//把服务器002jpg下载到E盘 // "E:\\88109924099901100353_20190103_20190103.txt";
CString strLocalFile = NULL;
strLocalFile.Format("E:\\%s", remote_file_name);
CString strRemoteFile = CString(remote_file_name);
if (strlen(local_path_file) > 0 || local_path_file != NULL) {
strLocalFile.Format("%s", local_path_file);
}
BOOL ret = pFtpConnection->GetFile(strRemoteFile, strLocalFile);
if (ret)
{
AfxMessageBox(_T("文件下载成功"));
}
else {
AfxMessageBox(_T("文件下载未成功"));
}
}
//释放资源
if (NULL != pFtpConnection)
{
pFtpConnection->Close();
delete pFtpConnection;
pFtpConnection = NULL;
}
if (NULL != pInternetSession)
{
delete pInternetSession;
pInternetSession = NULL;
}
}
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include <process.h>
#include <afxinet.h>
#pragma comment(lib, "WININET.LIB")
/*
char* address IP
char* username 用户
char* password 密码
char* ftp_path 远程路径
char* remote_file_name 远程文件名
char* local_path_file 本地文件目录
char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
*/
void FtpDownLoadFile(char* address, char* username, char* password, char* ftp_path, char* remote_file_name, char* local_path_file, char* flag_Tips)
{
// TODO: Add your control notification handler code here
CInternetSession * pInternetSession = NULL;
CFtpConnection * pFtpConnection = NULL;
//建立STP/SFTP连接 CInternetSession
pInternetSession = new CInternetSession(AfxGetAppName());
//服务器的ip地址
CString strADddress = CString(address);
//用户名与密码
CString strUserName = CString(username);
CString strPwd = CString(password);
//服务器的目录
CString strDir = CString(ftp_path); //服务器中的Image目录下
//若要设置为服务器的根目录,则使用"\\"就可以了
//创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了
pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd, 21);
//设置服务器的目录
bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir);
if (bRetVal == false)
{
AfxMessageBox("FTP 目录设置失败");
return;
}
else
{
//把服务器002jpg下载到E盘 // "E:\\88109924099901100353_20190103_20190103.txt";
CString strLocalFile = NULL;
strLocalFile.Format("E:\\%s", remote_file_name);
CString strRemoteFile = CString(remote_file_name);
if (strlen(local_path_file) > 0 || local_path_file != NULL) {
strLocalFile.Format("%s", local_path_file);
}
BOOL ret = pFtpConnection->GetFile(strRemoteFile, strLocalFile);
if (ret)
{
if (strcmp(flag_Tips, "FALSE") != 0) { // char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
AfxMessageBox(_T("文件下载成功"));
}
}
}
//释放资源
if (NULL != pFtpConnection)
{
pFtpConnection->Close();
delete pFtpConnection;
pFtpConnection = NULL;
}
if (NULL != pInternetSession)
{
delete pInternetSession;
pInternetSession = NULL;
}
}
void FtpUpLoadFile()
{
CInternetSession * pInternetSession = NULL;
CFtpConnection * pFtpConnection = NULL;
//建立连接
pInternetSession = new CInternetSession(AfxGetAppName());
//服务器的ip地址
CString strADddress = "192.168.1.61";
//用户名与密码
CString strUserName = "test";
CString strPwd = "123456";
//服务器的目录
CString strDir = "\\Image"; //服务器中的Image目录下
//若要设置为服务器的根目录,则使用"\\"就可以了
//创建了一个CFtpConnection对象,之后就可以通过这个对象进行上传文件,下载文件了
pFtpConnection = pInternetSession->GetFtpConnection(strADddress, strUserName, strPwd);
//设置服务器的目录
bool bRetVal = pFtpConnection->SetCurrentDirectory(strDir);
if (bRetVal == false)
{
AfxMessageBox("目录设置失败");
return;
}
else
{
//把本地文件上传到服务器上
CString strLocalFile = "D:\\002.jpg";
CString strRemoteFile = "001.jpg";
pFtpConnection->PutFile(strLocalFile, strRemoteFile);
}
//释放资源
if (NULL != pFtpConnection)
{
pFtpConnection->Close();
delete pFtpConnection;
pFtpConnection = NULL;
}
if (NULL != pInternetSession)
{
delete pInternetSession;
pInternetSession = NULL;
}
}
/************************************************************************/
/* 删除磁盘文件 成功返回0 失败返回小于0 */
/************************************************************************/
#include <io.h>
int remove_disk_file(const char* Path)
{
//char *Path="./saveHTMLfile.html";
if (_access(Path, 0) == -1) {
char buffer[200] = { '\0' };
wsprintf(buffer, "%s file does not exist!", Path);
Fprintf_Log(buffer);
AfxMessageBox(buffer, 0);
return -100;
};
if (!remove(Path)) {
Fprintf_Log("delete the file\r\n");
AfxMessageBox("delete the file\r\n", 0);
return 0;
}
else {
Fprintf_Log("Delete history file failed!");
AfxMessageBox("Delete history file failed!", 0);
return -1;
};
}
/************************************************************************/
/* 删除磁盘文件 成功返回0 失败返回小于0
char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
*/
/************************************************************************/
#include <io.h>
int remove_disk_file(const char* Path, char* flag_Tips)
{
//char *Path="./saveHTMLfile.html";
if (_access(Path, 0) == -1) {
char buffer[200] = { '\0' };
wsprintf(buffer, "%s file does not exist!", Path);
Fprintf_Log(buffer);
if (strcmp(flag_Tips, "FALSE") != 0) {
AfxMessageBox(buffer, 0);
}
return -100;
};
if (!remove(Path)) {
Fprintf_Log("delete the file\r\n");
if (strcmp(flag_Tips, "FALSE") != 0) {
AfxMessageBox("delete the file\r\n", 0);
}
return 0;
}
else {
Fprintf_Log("Delete history file failed!");
if (strcmp(flag_Tips, "FALSE") != 0) {
AfxMessageBox("Delete history file failed!", 0);
}
return -1;
};
}
//转换成大写
char * charToUPs(char* base)
{
if (int length = strlen(base)) {
for (long i = 0; i < length; i++)
{
base[i] = toupper(base[i]);
}
}
return base;
}
//====================oracle===========
const long L_MAX_RECORDS = 50000; //最大处理数量
_ConnectionPtr m_pConnection; //连接对象 连接智能指针 如需要在其他文件使用必须什么成外部全局变量 用extern 修饰
_RecordsetPtr m_pRecordset; //记录集对象 记录集智能指针 如需要在其他文件使用必须什么成外部全局变量 用extern 修饰
//连接
bool connect_oracl()
{
HRESULT hrt;
char* m_sUid = DB_USERNAME;
char* m_sPwd = DB_PASSWORD;
//char* m_sHost = "10.0.0.0";
char* m_sHost =DB_IP
char* m_sPort = DB_PORT
char* m_sSid = DB_SID
AfxMessageBox(m_sHost);
CString strConnect;
//x64
//strConnect.Format("Provider=OraOLEDB.Oracle.1;Password=%s;PersistSecurity Info=True;User ID=%s;DataSource=\"(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %s)) )(CONNECT_DATA = (SID = %s)))\"", m_sPwd, m_sUid, m_sHost, m_sPort, m_sSid);
strConnect.Format("Provider=OraOLEDB.Oracle.1;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %s))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = %s)));User Id=%s;Password=%s;", m_sHost, m_sPort, m_sSid, m_sUid, m_sPwd);
//x86
//strConnect="Provider=OraOLEDB.Oracle.1;Data Source=10.0.0.0:1521/orcl;User ID=XXXX;Password=XXXX;Unicode=True";
// CString connectionString = "Provider=MSDAORA.1;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.0)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)));User Id=XXXX;Password=XXXX;";
CString connectionString;
connectionString.Format("Provider=MSDAORA.1;Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %s))(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = %s)));User Id=%s;Password=%s;", m_sHost, m_sPort, m_sSid, m_sUid, m_sPwd);
try
{
::CoInitialize(NULL); //初始化com环境(必须,否则提示异常)
//创建Connection对象的一个实例
hrt = m_pConnection.CreateInstance(__uuidof(Connection)); //创建Connection对象
m_pConnection->Mode = adModeUnknown;
m_pConnection->ConnectionTimeout = 10; // 设置连接超时10秒
m_pConnection->CommandTimeout = 5;
m_pConnection->Open(_bstr_t(LPCTSTR(connectionString)), "", "", adModeUnknown); //通过用户名、密码以及连接字符串连接数据库
//Sleep(500);
//m_pConnection->CursorLocation = adUseClient; //设置使用客户端连接
}
catch (_com_error e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息: %s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
return FALSE;
}
catch (...)
{
T_SaveLog_KF("数据库连接失败!");
AfxMessageBox("数据库连接失败!");
return FALSE;
}
AfxMessageBox("open Oracle ok!");
//查询数据库
m_pRecordset.CreateInstance(_uuidof(Recordset));
//_ConnectionPtr pConnection = NULL;
try
{
//执行命令
hrt = m_pRecordset->Open(_T("select * from tab"), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
//AfxMessageBox(hrt);
}
catch (_com_error e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息: %s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
return FALSE;
}
if (SUCCEEDED(hrt))
{
//AfxMessageBox("测试查询成功");
T_SaveLog_KF("测试查询成功");
}
else if (FAILED(hrt))
{
AfxMessageBox("测试查询失败,但连接成功");
T_SaveLog_KF("测试查询失败,但连接成功");
}
return TRUE;
}
/**
关闭连接
**/
bool adoclose()
{
try {
if (m_pConnection != NULL)
{
if (m_pRecordset != NULL)
m_pRecordset->Close();//关闭结果集
m_pRecordset = NULL;
m_pConnection->Close();//关闭连接
m_pConnection = NULL;
//::CoUninitialize();//卸载COM环境
}
if (m_pConnection == NULL)
return TRUE;
else
return FALSE;
}
catch (_com_error e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息: %s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
return FALSE;
}
}
/*
C.也可通过Execute函数来获得结果集
*/
//获取结果集
//执行SQL语句
//执行SQL语句
_RecordsetPtr AdoExucute(char* sqlStr)
{
char cTemp[BUFSIZ * 20] = { '\0' };
memset(cTemp, '\0', sizeof(cTemp));
memcpy(cTemp, sqlStr, (strlen(sqlStr) + 1)); //+1 是为了将字符串后面的'\0'字符结尾符放进来,去掉+1可能出现乱码
//转换成大写
charToUPs(cTemp);
if (strstr(cTemp, "DROP") || strstr(cTemp, "TRUNCATE") || strstr(cTemp, "DELETE") || strstr(cTemp, "|"))
{
AfxMessageBox("危险操作被取消!");
return NULL;
}
try
{
if (m_pConnection == NULL)
{
AfxMessageBox("请连接数据库,再操作!");
return NULL;
}
_variant_t RecordsAffected;//此次操作的记录数
_RecordsetPtr PRecord;
T_SaveLog_KF("打开事物处理数据=========================");
m_pConnection->BeginTrans();//打开事物处理数据
T_SaveLog_KF(sqlStr);
//通过sql语句操作数据库并返回结果集指针
PRecord = m_pConnection->Execute(_bstr_t(sqlStr), &RecordsAffected, adCmdText);
/*
adCmdText 將 CommandText 視為指令的文字定義或預存程式
adCmdTable 將 CommandText 視為資料表名稱,其資料行由內部產生之 SQL 查詢所傳回
adCmdTableDirect 將 CommandText 視為資料表名稱,其資料行全部被傳回
adCmdStoredProc 將 CommandText 視為預存程序
AdCmdUnknown 預設值‧未知的 CommandText 屬性的指令型態
AdCommandFile 將 CommandText 視為永久性 Recordset 的檔案名稱
AdExecuteNoRecords 表示 CommandText 是不傳回資料列的指令或預存程序 (例如只插入資料的指令)若擷取到任何資料列,它們將被放棄而不被傳回‧它經常和 adCmdText 或 adCmdStoredProc 連合使用
*/
int IntRecords = RecordsAffected.intVal;
CString StrRecords = "";
if (IntRecords >= 0) {
StrRecords.Format("此次操作了 %d 条数据.", IntRecords); //IntRecords =-1 未操作数据 返回-1
AfxMessageBox(StrRecords);
}
T_SaveLog_KF((char*)(LPCTSTR)StrRecords);
if (IntRecords > L_MAX_RECORDS) {
m_pConnection->RollbackTrans(); //回滚
T_SaveLog_KF("操作数据量大于最大操作数量,回滚事物");
//PRecord->Cancel();
AfxMessageBox(_T("操作数据量大于最大操作数量,取消操作"));
return NULL;
}
m_pConnection->CommitTrans(); //提交事物
T_SaveLog_KF("提交事物(数据操作已提交!)=========================");
return PRecord;
}
catch (_com_error e)
{
CString strMsg;
m_pConnection->RollbackTrans(); //回滚事物
strMsg.Format(_T("回滚事物,错误描述:%s\n错误消息: %s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
T_SaveLog_KF(strMsg);
AfxMessageBox(strMsg);
}
return NULL;
}
/**
获取结果集
**/
void getRecordResult(_RecordsetPtr PRecord)
{
if (PRecord == NULL || PRecord->GetadoEOF()) {
return;
}
_variant_t vIndex = (long)0;
_variant_t vCount = PRecord->GetCollect(vIndex);
CString message;
message.Format("共有%d条记录", vCount.lVal);
AfxMessageBox(message);
long rowsCount = PRecord->GetRecordCount();
long pageCount = PRecord->GetPageCount();
char* p = NULL;
try
{
while (!PRecord->GetadoEOF()) {
FieldsPtr fds = PRecord->GetFields();
long countcolums = fds->GetCount();
CString column_name = NULL;
for (int i = 0; i < countcolums; i++)
{
FieldPtr fieldptr = fds->GetItem(_variant_t(short(i)));
column_name = (LPCTSTR)fieldptr->GetName(); //获取列名字段名称
DataTypeEnum date_type = fieldptr->GetType(); //获取列数据类型
//HRESULT ht= fieldptr->get_Type(&date_type);
IID iid = fieldptr.GetIID();
_variant_t value = fieldptr->GetValue(); //获取列数据
_variant_t value_t = PRecord->GetCollect((LPCTSTR)column_name); //获取列数据
if (value_t.vt == VT_NULL) {
value = "";
value_t = "";
}
message.Format("%s == %s", (char*)(LPCTSTR)column_name, (LPCSTR)_bstr_t(value));
message.Format("%s == %s", (char*)(LPCTSTR)column_name, (LPCSTR)_bstr_t(value_t));
//message.Format("%s %s %s", (char*)(LPCTSTR)column_name, date_type, value.cVal);
AfxMessageBox(message);
}
PRecord->MoveNext();
}
}
catch (_com_error &e)
{
CString strMsg;
strMsg.Format(_T("错误描述:%s\n错误消息: %s"),
(LPCTSTR)e.Description(),
(LPCTSTR)e.ErrorMessage());
AfxMessageBox(strMsg);
}
}
/********************************
根据英文分号打断sql 逐条执行
********************************/
int AdoExucuteByList(char* pReadBuf)
{
#pragma warning(disable : 4996)
char sql_buf[BUFSIZ * 20] = { '\0' };
char *p = NULL;
_RecordsetPtr record = NULL;
int j = 0;
while (true) {
memset(sql_buf, 0, sizeof(sql_buf));
if (j == 0)
{
p = strtok(pReadBuf, ";");
sprintf_s(sql_buf, "%s", p);
}
else
{
p = strtok(NULL, ";");
sprintf_s(sql_buf, "%s", p);
}
j++;
if (!p || strlen(sql_buf) <= 0)
{
break;
}
record = AdoExucute(sql_buf);
//Dialog_XXXX2::GetRecordResult_insert_list(record);
if (IDNO == AfxMessageBox("选择是否继续执行?", MB_YESNO)) {
AfxMessageBox("结束执行!");
return j;
}
}
return j;
}
/*********************************************************
* 名称:FieldType
* 功能:返回字段类型
* 用法:FieldType(nType as integer)
*********************************************************
Function FieldType(nType As Integer) As String
Select Case nType
Case 128
FieldType = "BINARY"
Case 11
FieldType = "BIT"
Case 129
FieldType = "CHAR"
Case 135
FieldType = "DATETIME"
Case 131
FieldType = "DECIMAL"
Case 5
FieldType = "FLOAT"
Case 205
FieldType = "IMAGE"
Case 3
FieldType = "INT"
Case 6
FieldType = "MONEY"
Case 130
FieldType = "NCHAR"
Case 203
FieldType = "NTEXT"
Case 131
FieldType = "NUMERIC"
Case 202
FieldType = "NVARCHAR"
Case 4
FieldType = "REAL"
Case 135
FieldType = "SMALLDATETIME"
Case 2
FieldType = "SMALLMONEY"
Case 6
FieldType = "TEXT"
Case 201
FieldType = "TIMESTAMP"
Case 128
FieldType = "TINYINT"
Case 17
FieldType = "UNIQUEIDENTIFIER"
Case 72
FieldType = "VARBINARY"
Case 204
FieldType = "VARCHAR"
Case 200
FieldType = ""
End Select
End Function
*********************************************************/
//====================oracle===========
#include "stdio.h"
/**
读取文件所有内容并舍弃包含标识的行数据
**/
int __stdcall ReadSqlFile(const char *path_file, char * pReadBuf, char *line_notes_flag)
{
FILE *fp = NULL;
char str[BUFSIZ * 10];
if ((fp = fopen(path_file, "r")) == NULL) {
AfxMessageBox("cannot open file");
return -1;
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
if (strstr(str, line_notes_flag)) {
continue;
}
printf("%s", str);
strcat(pReadBuf, str);
}
}
fclose(fp);
AfxMessageBox(pReadBuf);
return 0;
}
#include "stdio.h"
/**
读取文件所有内容并将包含标识的行数据 从标识处接断舍弃
**/
int __stdcall ReadSqlFileTok(const char *path_file, char * pReadBuf, char *line_notes_flag)
{
FILE *fp = NULL;
char str[BUFSIZ * 10] = { '\0' };
char temp[BUFSIZ * 10] = { '\0' };
if ((fp = fopen(path_file, "r")) == NULL) {
AfxMessageBox("cannot open file");
return -1;
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
if (char*p = strstr(str, line_notes_flag)) {
memset(temp, '\0', sizeof(temp));
strncpy(temp, str, p - str);
strcat(pReadBuf, temp);
continue;
}
printf("%s", str);
strcat(pReadBuf, str);
}
}
fclose(fp);
if (fp) {
fclose(fp);
}
AfxMessageBox(pReadBuf);
return 0;
}
#include "stdio.h"
/**
读取文件所有内容并将包含标识的行数据 从标识处接断舍弃
char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
**/
int __stdcall ReadSqlFileTok(const char *path_file, char * pReadBuf, char *line_notes_flag, char* flag_Tips)
{
FILE *fp = NULL;
char str[BUFSIZ * 10] = { '\0' };
char temp[BUFSIZ * 10] = { '\0' };
if ((fp = fopen(path_file, "r")) == NULL) {
AfxMessageBox("cannot open file");
return -1;
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
if (char*p = strstr(str, line_notes_flag)) {
memset(temp, '\0', sizeof(temp));
strncpy(temp, str, p - str);
strcat(pReadBuf, temp);
continue;
}
printf("%s", str);
strcat(pReadBuf, str);
}
}
fclose(fp);
if (fp) {
fclose(fp);
}
if (strcmp(flag_Tips, "FALSE") != 0) {
AfxMessageBox(pReadBuf);
}
return 0;
}
#include "stdio.h"
/**
读取文件内容返回查找的数据行 可返回多行数据
**/
char* __stdcall ReadFileSearch(const char* path_file, char* pReadBuf, char* search_srting)
{
FILE *fp = NULL;
char str[BUFSIZ * 5];
if ((fp = fopen(path_file, "r")) == NULL) {
AfxMessageBox("cannot open file");
return NULL;
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
if (strstr(str, search_srting)) {
strcat(pReadBuf, str);
}
}
}
fclose(fp);
strlen(pReadBuf) <= 0 ? AfxMessageBox("无匹配数据!!") : AfxMessageBox(pReadBuf);
return pReadBuf;
}
#include "stdio.h"
/**
读取文件内容返回查找的数据行 可返回多行数据
char* flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
**/
char* __stdcall ReadFileSearch(const char* path_file, char* pReadBuf, char* search_srting, char* flag_Tips)
{
FILE *fp = NULL;
char str[BUFSIZ * 5];
if ((fp = fopen(path_file, "r")) == NULL) {
AfxMessageBox("cannot open file");
return NULL;
}
memset(pReadBuf, '\0', sizeof(pReadBuf));
while (!feof(fp)) {
if (long count = fgets(str, sizeof(str) - 1, fp) != NULL) { //读取一行数据
if (strstr(str, search_srting)) {
strcat(pReadBuf, str);
}
}
}
fclose(fp);
if (fp) {
fclose(fp);
}
if (strcmp(flag_Tips, "FALSE") != 0) { //flag_Tips 是否提示信息 FALSE 不提示,TRUE 提示
strlen(pReadBuf) <= 0 ? AfxMessageBox("无匹配数据!!") : AfxMessageBox(pReadBuf);
}
return pReadBuf;
}
/************************************************************************/
/* 选择文件获得文件路径 */
/************************************************************************/
const CString chose_file_path()
{
// TODO: 在此添加控件通知处理程序代码
CString FilePathName;
CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
NULL,
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
(LPCTSTR)_TEXT("JPG Files (*.jpg)|*.jpg|TXT Files(*.txt)|*.txt|All Files (*.*)|*.*|"),
NULL);
if (dlg.DoModal() == IDOK)
{
FilePathName = dlg.GetPathName(); //文件名保存在了FilePathName里
}
else
{
return NULL;
}
AfxMessageBox(FilePathName);
return FilePathName;
}
/* 功 能:将str字符串中的oldstr字符串替换为newstr字符串
* 参 数:str:操作目标 oldstr:被替换者 newstr:替换者
* strcat() 通过字符串连接实现 保证源字符串空间足够
* 返回值:返回替换之后的字符串
*/
char* str_replace(char* str, const char *oldstr, const char *newstr)
{
char bstr[BUFSIZ * 10];//转换缓冲区
memset(bstr, '\0', sizeof(bstr));
for (unsigned int i = 0; i < strlen(str); i++) {
if (!strncmp(str + i, oldstr, strlen(oldstr))) {//比较字符串是否相等
strcat(bstr, newstr);
i += strlen(oldstr) - 1;
}
else {
strncat(bstr, str + i, 1);//保存一字节进缓冲区
}
}
strcpy(str, bstr);
return str;
}
/*
*去掉字符串首尾的 \x20 \r \n 字符
*/
void TrimSpace(char* str)
{
char *start = str - 1;
char *end = str;
char *p = str;
while (*p)
{
switch (*p)
{
case ' ':
case '\r':
case '\n':
{
if (start + 1 == p)
start = p;
}
break;
default:
break;
}
++p;
}
//现在来到了字符串的尾部 反向向前
--p;
++start;
if (*start == 0)
{
//已经到字符串的末尾了
*str = 0;
return;
}
end = p + 1;
while (p > start)
{
switch (*p)
{
case ' ':
case '\r':
case '\n':
{
if (end - 1 == p)
end = p;
}
break;
default:
break;
}
--p;
}
memmove(str, start, end - start);
*(str + (int)end - (int)start) = 0;
}
#include <io.h>
/************************************************************************/
/* 判断文件路径是否存在 或者权限
int access(const char *filename, int amode);
amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。
这个函数还可以检查其它文件属性:
06 检查读写权限
04 检查读权限
02 检查写权限
01 检查执行权限
00 检查文件的存在性
而这个就算这个文件没有读权限,也可以判断这个文件存在于否
存在返回0,不存在返回-1*/
/************************************************************************/
int file_exists(const char *PATH, int iMode) {
return _access(PATH, iMode);
}
/************************************************************************/
/*
判断参数是否是数字组成
*/
/************************************************************************/
bool IsNumber(const char * input)
{
for (int i = 0; i < (int)strlen(input); i++)
{
int tmp = (int)input[i];
if (tmp >= 48 && tmp <= 57)
{
continue;
}
else
{
return false;
}
}
return true;
}
/************************************************************************/
/*
判断参数是否是数字组成
*/
/************************************************************************/
bool IsNumber2(const char * input)
{
for (int i = 0; i < (int)strlen(input); i++)
{
if (isdigit(input[i] == 0))
{
continue;
}
else
{
return false;
}
}
return true;
}
/************************************************************************/
/*
统计字符串出现次数
*/
/************************************************************************/
long Count_String(const char * Original_Str, const char * Finded_Str)
{
long count = 0L;
long length = strlen(Finded_Str);
const char *p = Original_Str;
if (strlen(Finded_Str) > strlen(Original_Str) || !Finded_Str) {
return -1L;
}
do {
p = strstr(p, Finded_Str);
if (p) {
count++;
p += length;
}
} while (p);
return count;
}
/************************************************************************/
/*
统计字符出现次数
*/
/************************************************************************/
long Count_Char(const char * Original_Str, int C)
{
long count = 0L;
const char *p = Original_Str;
if (!Original_Str && !C) {
return -1L;
}
do {
p = strchr(p, C);
if (p) {
count++;
p++;
}
} while (p);
return count;
}
/************************************************************************/
/*
获取windows系统进程号 线程号
*/
/************************************************************************/
CString Get_PID_UPD_AfxMessageBox(char * msg_Tips)
{
CString strMsg;
strMsg.Format(_T("%s\n\r当前进程号:%d\n执行线程号: %d"),
msg_Tips,
GetCurrentProcessId(),
GetCurrentThreadId());
AfxMessageBox(strMsg);
return strMsg;
}
/**********************************************************************/
/*
拼接sql字符串
char* key_value[][2]
*/
/**********************************************************************/
char* sqladd(char* key_value[][2], char* add_sql)
{
/*
char* initSQL = "insert into %s (%s) values(%s)";
char* tabname = "Y_REFUND_LOG";
char* column_names = "FUND_SEQ_NO,BATCH_NO,SET_YEAR,SOCIAL_CODE,OLD_FUND_SEQ_NO,TRAN_TYPE,CHANNEL,STATUS,OUT_ACCT_NO,INPUT_DATE,TRAN_DATE,TRAN_AMT,PAY_MODE,OUT_BANK_CODE,SUMMARY,IS_CHECK,USAGE,CHECK_MSG,RET_CODE,RET_MSG,OPERATOR,AUDITOR,REMARK,BIZ_SEQ_NO,RECORD_TYPE,HOST_DATE,HOST_SID,TOTAL_AMT,TOTAL_NUM,S_AMT,S_NUM,F_AMT,F_NUM,OUT_ACCT_NAME,IN_ACCT_NO,IN_ACCT_NAME,IN_ACCT_BANK,IN_ACCT_BANKNO,BATCH_STATUS,IN_BANK_CODE,IS_FINISH,SOCIAL_NO,SEND_FILE_NAME,RECEIVE_FILE_NAME,TRAN_TIME,OUT_ACCT_BANKNO,IS_ENTRUST,PAY_CHANNEL,AUDITOR_CHECK_TIME,IS_SAME_BANK,YAD107";
char column_names_key[52][BUFSIZ];
char column_names_values[52][BUFSIZ] = {};
sprintf_s(values, sizeof(values), "%s\'%s\',", values, "代付退款跨行归集"); //remark
sprintf_s(values, sizeof(values), "%s%s,", values, "NULL");
*/
int count = sizeof(*key_value); //这个会显示出二维数组中每个行的元素个数 (这里是指可容纳的个数)
int sie = sizeof(key_value);//这个会显示出二维数组中元素的个数(这里是指可容纳的个数)
memset(add_sql,0,sizeof(add_sql));
int i = 0; int j = 0;
if (key_value[0][0]) {
for (i = 0; i < count; i++) {
if (key_value[i][0])
{
if (key_value[i][1]) {
sprintf_s(add_sql, sizeof(add_sql), "%s\'%s\',", key_value[i][0], key_value[i][1]);
}
else
{
sprintf_s(add_sql, sizeof(add_sql), "%s%s,", key_value[i][0], "NULL");
}
}
else
{
break;
}
}
}
else
{
}
return add_sql;
}
/**********************************************************************/
/*
拼接sql字符串
char* key_value[][2]
*/
/**********************************************************************/
char* sqladd2(char* _value[2][BUFSIZ], char* add_sql)
{
return NULL;
}
/**********************************************************************
字符串转数字 long double
**********************************************************************/
long double Atolongdouble(char* A)
{
long double ldRet = 0;
long long llBefore = 0;
double dAfter = 0;
long signscale = 0L;
char a[BUFSIZ] = { 0 };
char temp[BUFSIZ] = { 0 };
if (strlen(A) <= 0) {
throw "入参异常!";
}
memset(a, 0, sizeof(a));
strcat(a, A);
char* p = strtok(a, ".");
llBefore = atoll(p);
p = strtok(NULL, ".");
signscale = strlen(p);
memset(temp, 0, sizeof(temp));
sprintf_s(temp, sizeof(temp), "0.%s", p);
dAfter = atof(temp);
double fAfter = atof(temp);
ldRet = llBefore + dAfter;
return ldRet;
}
/**********************************************************************
字符串转数字 long double
**********************************************************************/
char* AtolongdoubleX100(char* A)
{
long double ldRet = 0;
long long llBefore = 0;
double dAfter = 0;
long signscale = 0L;
static char a[BUFSIZ] = { 0 };
char temp[BUFSIZ] = { 0 };
if (strlen(A) <= 0) {
throw "入参异常!";
}
memset(a, 0, sizeof(a));
strcat(a, A);
char* p = strtok(a, ".");
llBefore = atoll(p);
p = strtok(NULL, ".");
signscale = strlen(p);
//long la = atol(p);
memset(temp, 0, sizeof(temp));
if (strlen(p) == 0)
{
sprintf_s(temp, sizeof(temp), "00");
}
if (strlen(p) == 1)
{
sprintf_s(temp, sizeof(temp), "%s0",p);
}
if (strlen(p) == 2)
{
sprintf_s(temp, sizeof(temp), "%s", p);
}
if (strlen(p) > 2 || signscale > 2) {
strncpy(temp, p,2);
strcat(temp, ".");
strcat(temp, p + 2);
}
memset(a,0,sizeof(a));
sprintf_s(a, sizeof(a), "%lld%s", llBefore, temp);
return a;
}
#include "afxwin.h"
//复制到剪切板
void CopyCStringToClipboard(CString str)
{
//CString str;
//str的值从外部获取
if (0 == str.GetLength()) {
AfxMessageBox(_T("数据为空"));
return;
}
//将CString转换为char
USES_CONVERSION;
//调用函数,T2A和W2A均支持ATL和MFC中的字符转换
//char * charData = T2A(str);
//char * charData = W2A(str); //也可实现转换
char * charData = (char*)(LPCTSTR)(str);
//将数据保存至粘贴板
HGLOBAL hClip;
//定义一个HGLOBAL句柄变量用来指向分配的内存块
if (OpenClipboard(NULL))
{
EmptyClipboard(); //将剪贴板内容清空
hClip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() + 1);
//在堆上分配可移动的内存块,程序返回一个内存句柄
char * buff; //定义指向字符型的指针变量
buff = (char*)GlobalLock(hClip);
//对分配的内存块进行加锁,将内存块句柄转化成一个指针,并将相应的引用计数器加1
strcpy(buff, charData);
//将用户输入的数据复制到指针变量中,实际上就是复制到分配的内存块中
GlobalUnlock(hClip);
//数据写入完毕,进行解锁操作,并将引用计数器数字减1
SetClipboardData(CF_TEXT, hClip);
//将存放有数据的内存块放入剪贴板的资源管理中
CloseClipboard();
//关闭剪贴板,释放剪贴板资源的占用权
AfxMessageBox(_T("已将数据存入剪贴板"));
}
else
{
AfxMessageBox(_T("不能打开剪贴板"));
}
}
/**************************************
将整个文件复制到剪贴板,注意是文件不是文本内容
CopyFileToClipboard("D:\\user.txt");
**************************************/
int CopyFileToClipboard(char szFileName[])
{
UINT uDropEffect;
HGLOBAL hGblEffect;
LPDWORD lpdDropEffect;
DROPFILES stDrop;
HGLOBAL hGblFiles;
LPSTR lpData;
//与剪贴板交互的数据格式并非标准剪贴板格式,因此需要注册
uDropEffect = RegisterClipboardFormat("Preferred DropEffect");
//为剪贴板数据分配空间
hGblEffect = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(DWORD));
lpdDropEffect = (LPDWORD)GlobalLock(hGblEffect);
//设置操作的模式
*lpdDropEffect = DROPEFFECT_COPY;//复制; 剪贴则用DROPEFFECT_MOVE
GlobalUnlock(hGblEffect);
//剪贴板数据需要一个这个结构
stDrop.pFiles = sizeof(DROPFILES);//文件列表相对于结构的偏移量
stDrop.pt.x = 0;
stDrop.pt.y = 0;
stDrop.fNC = FALSE;
stDrop.fWide = FALSE;//宽字符设置
//分配数据空间,并且预留文件名的空间
//文件列表为两个'\0'结尾,因此需要多分配2个字节
hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(DROPFILES) + strlen(szFileName) + 2);
lpData = (LPSTR)GlobalLock(hGblFiles);
memcpy(lpData, &stDrop, sizeof(DROPFILES));
strcpy(lpData + sizeof(DROPFILES), szFileName);
GlobalUnlock(hGblFiles);
//普通的剪贴板操作
OpenClipboard(NULL);
EmptyClipboard();
//设置剪贴板文件信息
SetClipboardData(CF_HDROP, hGblFiles);
//设置剪贴板操作信息
SetClipboardData(uDropEffect, hGblEffect);
CloseClipboard();
return 1;
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

这个博客分享了一组C语言的工具类函数,包括FTP、数据库连接、日志记录、文件读写、字符串处理、文件操作等实用功能。例如,提供函数用于FTP文件上传下载、连接Oracle数据库、按行读取文件、转换字符串为大写等。这些函数方便开发者在C语言项目中快速实现常见任务。

被折叠的 条评论
为什么被折叠?



