前一段时间有个项目需要调用psftp传送文件, 现在总结一下:
1 putty版本 0.62
开发环境vs2005
2 编译
putty完整工程在这个目录下: putty\WINDOWS\MSVC
3 定制psftp
psftp的入口函数是 int main(int argc, char *argv[]), 在winsftp.c中定义。
主要做了如下定制:
(1)命令行参数(psftp.exe通过CreateProcess调用)
通过命令行传入调用程序的信息,例如主窗口句柄等;
(2)输出
把psftp的输出定向到指定的文件;
//通过fprintf直接输出。
(3)把压缩进度通过进程间内存读写输送到调用程序。
//进度通过WriteProcessMemory传递
//定制函数:int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
void SendMessageToMainWnd(INT16 nRatio, char* szPath);
extern __int64 g_llTotalSize;
extern __int64 g_llTotalSizeSent;
extern int g_ratio;
int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
{
...
while (xfer_upload_ready(xfer) && !err && !eof)
{
len = read_from_file(file, buffer, sizeof(buffer));
if (len == -1) {
printf("error while reading local file\n");
err = 1;
} else if (len == 0) {
eof = 1;
} else {
xfer_upload_data(xfer, buffer, len);
datasend.lo += len;
g_llTotalSizeSent += len;
newratio = ((float)datasend.lo)/((float)filelen.lo)*100;
g_ratio = ((double)g_llTotalSizeSent)/((double)g_llTotalSize)*100;
if(newratio!=oldratio)
{
oldratio = newratio;
SendMessageToMainWnd(g_ratio, fname);
}
}
}
...
}