51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6981|回复: 23
打印 上一主题 下一主题

[原创] 在写FTP脚本中变量的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-7-17 10:58:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大侠们好:
遇到一个问题,我是要从本地Windows客户端上上传数据到FTP端,并且覆盖原来数据,
注意,我希望是随机取Windows客户端的文件中5个文件之一(文件名为0,1,2,3,4),随机覆盖目标文件夹的目标文件(1000个之一,文件名位0,1,2,……999)。
所以这里取了两个随机函数取随机值;
int s,d;
s=rand()%5;
d=rand()%1000;
ftp_put_ex(&ftp_session,"Ftp_Put", "MSOURCE_PATH=d:/R710/data/%d", "TARGET_PATH=/000/%d",s,d,"MODE=BINARY", ENDITEM , LAST);

运行系统报错如下:
Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(18): Debug message:Ftp Logon successful.
Action.c(24): Error: C interpreter run time error: Action.c (24):  Error -- memory violation : Exception ACCESS_VIOLATION received.
Action.c(24): Notify: CCI trace: Action.c(24): ftp_put_ex(0x02990020, 0x00b80236 "Ftp_Put", 0x00b80219 "MSOURCE_PATH=d:/R710/data/%d", 0x00b80205 "TARGET_PATH=/000/%d", 1, 169, 0x00b801f9 "MODE=BINARY", 0x00b801f1 "ENDITEM", 0x00b80243 "LAST")

.
Action.c(24): Notify: CCI trace: Compiled_code(0): Action()
.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.


请赐教,应该怎么解决这个问题。谢谢。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

24#
发表于 2011-7-20 19:14:15 | 只看该作者
我已经放弃了,要做99个Session并发,看来只能是一个一个添加99个session了。
zenglei 发表于 2010-7-21 09:00


&ftp_Session, 如果多用户并发的话,会报错哦。
是否只有100个用户的话,搞一百个sesion哦?
回复 支持 反对

使用道具 举报

该用户从未签到

23#
发表于 2010-7-21 10:29:50 | 只看该作者

回复 22# 的帖子

并发不用写不一样的吧? &ftp这个只是globals里 FTP ftp;分配的一个初始内存地址。。。每个user实际的内存地址不会出来一样的
回复 支持 反对

使用道具 举报

该用户从未签到

22#
 楼主| 发表于 2010-7-21 09:00:05 | 只看该作者
原帖由 skyzhu 于 2010-7-20 16:10 发表
还是放弃&ftp_session的参数化吧,反正这个没有影响
就算真弄出来了,内存地址也不是随便可以乱来的



我已经放弃了,要做99个Session并发,看来只能是一个一个添加99个session了。
回复 支持 反对

使用道具 举报

该用户从未签到

21#
发表于 2010-7-20 16:10:43 | 只看该作者

回复 20# 的帖子

还是放弃&ftp_session的参数化吧,反正这个没有影响
就算真弄出来了,内存地址也不是随便可以乱来的
回复 支持 反对

使用道具 举报

该用户从未签到

20#
 楼主| 发表于 2010-7-20 14:40:41 | 只看该作者
原帖由 skyzhu 于 2010-7-19 18:04 发表



ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
ftp_put_ex(&ftp_session1,"Ftp_Put",
"PATH=d:\R710\data/{aaaa}",
"TARGET_PATH=/0/000/000/{bbbb}/{aaaa}",
"MODE=ASCI ...

对了,我研究了下参数化。发现只用一句话就搞定了。自己试了试ftpsession,没有弄出来。

ftp_put_ex(&ftp_session,"Ftp_Put","SOURCE_PATH=d:/R710/data/{NewParam}","TARGET_PATH=/0/000/000/{NewParam_1}.{NewParam_2}","MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);


你试出来了没?
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2010-7-19 18:04:09 | 只看该作者
原帖由 zenglei 于 2010-7-19 17:24 发表



哈哈,楼主是菜鸟,接触LR才几天,关于你说的参数化{0,1,2,3,4},是怎么用的呢?
请赐教。
比如我向把&ftp_session也植入变量,应该怎么弄呢?
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII",  ...



ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
ftp_put_ex(&ftp_session1,"Ftp_Put",
"PATH=d:\R710\data/{aaaa}",
"TARGET_PATH=/0/000/000/{bbbb}/{aaaa}",
"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
ftp_logout_ex(&ftp_session1);   

/0/000/000/  是服务器不变的父目录,不知道你这里是不是
点 param list, ctrl + L 新建 aaaa, bbbb 的参数,具体设置网上看看吧
aaaa 参数里面设置你要的文件名
bbbb 参数里面设置你要的文件夹名字

&ftp_session1能不能搞定不知道,试出来告诉你
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2010-7-19 17:24:53 | 只看该作者
原帖由 skyzhu 于 2010-7-19 16:24 发表
额,看来楼主不太会用LR自带的参数。。。
写这么多用参数形式就一句话,呵呵
参数不是 {0,1,2,3,4} 这么用的。。。



哈哈,楼主是菜鸟,接触LR才几天,关于你说的参数化{0,1,2,3,4},是怎么用的呢?
请赐教。
比如我向把&ftp_session也植入变量,应该怎么弄呢?
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
谢啦,大侠

[ 本帖最后由 zenglei 于 2010-7-19 17:27 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2010-7-19 16:56:28 | 只看该作者
额虽然没试过,不过大概明白你们两个在说啥了,

一个是用c语言解决
一个是用参数化解决
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2010-7-19 16:24:46 | 只看该作者
额,看来楼主不太会用LR自带的参数。。。
写这么多用参数形式就一句话,呵呵
参数不是 {0,1,2,3,4} 这么用的。。。
回复 支持 反对

使用道具 举报

该用户从未签到

15#
 楼主| 发表于 2010-7-19 15:22:39 | 只看该作者

答谢贴

问题解决。
ftp_put_ex只能识别特定顺序的字符串参数PATH和TARGET_PATH,所以要把变量都转化位字符。
为以后的童鞋们能解决类似问题,特把正确的程序发出来,如下:
Action()
{
     // Logon to the FTP server
unsigned long *ftp_session1=NULL;
char source_dir[200], S[250];
char dest_dir[200], D[250];
char *directorys="d:\\R710\\data\\";
char *directoryd="/0/000/000/";
int s,d;
char temps[60];
char tempd[60];
char x[10] , y[10];
ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;

     if (!itoa(s, temps, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          sprintf (source_dir, "%s%s", directorys, temps);
          lr_output_message("Source file name %s", source_dir);
     }
if (!itoa(d, tempd, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (dest_dir, "%s%s", directoryd, tempd);
          lr_output_message("Dest file name %s", dest_dir);
     }
sprintf (S, "SOURCE_PATH=%s", source_dir);
sprintf (D, "TARGET_PATH=%s", dest_dir);
lr_output_message(source_dir);
lr_output_message(dest_dir);
ftp_put_ex(&ftp_session1,"Ftp_Put",S,D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);
// Logout from the FTP server      
ftp_logout_ex(&ftp_session1);      
return 0;
}


感谢大家的帮助,把问题解决了,尤其感谢云层大叔,他的回复是正确的。谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2010-7-19 15:03:20 | 只看该作者
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/test4", "TARGET_PATH=/0/000/000/000.0","MODE=ASCII", ENDITEM ,LAST);

SOURCE_PATH和TARGET_PATH中直接放具体某一文件的目录:
SOURCE_PATH=d:/R710/data/test4
TARGET_PATH=/0/000/000/000.0
是可以传输的。这是肯定的。
结果是:
Action.c(42): Debug messageutting file d:/R710/data/test4 in /0/000/000/000.0, passive mode set to 0
Action.c(42): Debug message:Ftp put of d:/R710/data/test4 finished successfully
Action.c(42): Debug message:Ftp Put ended successfully.
Action.c(79): Debug message:Ftp Session closed successfully.

现在我希望SOURCE_PATH和TARGET_PATH中不是指向某一具体文件,而是一个变量,这个变量是指随机的文件名。
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2010-7-19 14:55:46 | 只看该作者
原帖由 skyzhu 于 2010-7-19 14:36 发表
path 、 TARGET_PATH 都一定要指到 文件名为止,到文件夹会报错,帮助里面写错了,直接拷出来肯定报错

ftp_put_ex(&ftp, "Ftp_Put",
"ATH=d:/R710/data/{随机文件名5}",
"TARGET_PATH=/父目录/{随机目录1000}/ ...


关键是ftp_put_ex识别不了,我的程序路径就指向到具体的文件的,程序是:
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/{0,1,2,3,4}", "TARGET_PATH=/0/000/000/{000.0,001.0,002.0}","MODE=ASCII", ENDITEM ,LAST);

报错是:

Action.c(42): Debug messageutting file d:/R710/data/{0,1,2,3,4} in /0/000/000/{000.0,001.0,002.0}, passive mode set to 0
Action.c(42): Error -86026:Failed to open d:/R710/data/{0,1,2,3,4} for reading.
Action.c(42): Error -86027:Failed to put data: 226 File successfully transferred

回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2010-7-19 14:36:57 | 只看该作者
path 、 TARGET_PATH 都一定要指到 文件名为止,到文件夹会报错,帮助里面写错了,直接拷出来肯定报错

ftp_put_ex(&ftp, "Ftp_Put",
"PATH=d:/R710/data/{随机文件名5}",
"TARGET_PATH=/父目录/{随机目录1000}/{随机文件名5}",
"MODE=ASCII",
ENDITEM,
LAST);

[ 本帖最后由 skyzhu 于 2010-7-19 14:42 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

11#
 楼主| 发表于 2010-7-19 14:03:04 | 只看该作者
原帖由 云层 于 2010-7-19 12:03 发表
那么你可以试试直接拼接Target_path整个字符串,一般就可以了

是可以的。

程序是:
unsigned long *ftp_session1=NULL;
char source_dir[200], S[250];
char dest_dir[200], D[250];
char *directorys="d:\\R710\\data\\";
char *directoryd="/0/000/000/";
int s,d;
char temps[60];
char tempd[60];
char x[10] , y[10];
ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;
    if (!itoa(s, temps, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (source_dir, "%s%s", directorys, temps);
          lr_output_message("Source file name %s", source_dir);
     }
if (!itoa(d, tempd, 10))
          lr_output_message("Cannot convert i to ascii char");
     else {
          //sprintf(source_dir,"%s", directorys);
          sprintf (dest_dir, "%s%s", directoryd, tempd);
          lr_output_message("Dest file name %s", dest_dir);
     }
sprintf (S, "SOURCE_PATH=%s", source_dir);
sprintf (D, "TARGET_PATH=%s", dest_dir);
lr_output_message(source_dir);
lr_output_message(dest_dir);
ftp_put_ex(&ftp_session1,"Ftp_Put","%s",S, "%s",D,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);

[ 本帖最后由 zenglei 于 2010-7-19 15:17 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2010-7-19 12:03:27 | 只看该作者
那么你可以试试直接拼接Target_path整个字符串,一般就可以了
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2010-7-19 11:58:17 | 只看该作者
原帖由 云层 于 2010-7-19 11:38 发表
5#的可能性大点,不是说sprintf可以带参数写法,ftp就能写



是这个道理。
我也就只是试试了下,结果不得行滴。
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2010-7-19 11:55:27 | 只看该作者
原帖由 skyzhu 于 2010-7-19 10:57 发表
文件名挂随机参数拼接
ftp_put_ex(&ftp, "Ftp_Put",
              "PATH=d:/R710/data/{filename5}",
"TARGET_PATH=/000/{filename1000}",
"MODE=ASCII",
              ENDITEM,
              LAST);  ...




哥,说清楚点吧,我试了不行。不知道是不是照着你的意思做的。

对了,我的源文件和目标文件是随机生成的,文件名是源是{0,1,2,3,4}  目标文件夹{0,1,……999},我希望能随机取源{0,1,2,3,4}中任一个文件取覆盖目标文件夹{0,1,……999}中任一个文件。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2010-7-19 11:38:07 | 只看该作者
5#的可能性大点,不是说sprintf可以带参数写法,ftp就能写
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2010-7-19 11:03:07 | 只看该作者
原帖由 云层 于 2010-7-18 10:12 发表
这个地方要写字符串吧,改成字符串试试,你最好把原来的代码格式也发一下


改成了字符串也不可以的。Action中代码如下:
Action()
{
     // Logon to the FTP server
unsigned long *ftp_session1=NULL;
//unsigned long *ftp_session2=NULL;
//unsigned long *ftp_session3=NULL;
//unsigned long *ftp_session4=NULL;
char source_dir[200];
char dest_dir[200];
char *directorys;
char *directoryd;
int s,d;

ftp_logon_ex(&ftp_session1,"FTP","URL=ftp://zl:zl@129.22.145.200",  LAST);
s=rand()%5;
d=(rand()%899)+100;
sprintf(source_dir,"%s%d", directorys,s);
sprintf(dest_dir,"%s", directoryd);
ftp_put_ex(&ftp_session1,"Ftp_Put", "SOURCE_PATH=d:/R710/data/%s", "TARGET_PATH=/0/000/000/%s",source_dir,dest_dir,"MODE=ASCII", "PASSIVE=TRUE",ENDITEM , LAST);   
// Logout from the FTP server      
ftp_logout_ex(&ftp_session1);      
return 0;
}


在ftp_put_ex中,"SOURCE_PATH=d:/R710/data/%s", "TARGET_PATH=/0/000/000/%s"是被双引号引用的,里面就是一串字符了,想在一串字符中插入变量应该是没问题哦。
就像sprintf(source_dir,"%s123456/%d", directorys,s);生成的source_dir是“directorys”123456“s”一样。
现在就是想要在其中加入变量,请教下怎么能让他识别呢?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-13 14:44 , Processed in 0.105952 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表