51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6972|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2010-7-18 10:12:55 | 只看该作者
这个地方要写字符串吧,改成字符串试试,你最好把原来的代码格式也发一下
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2022-5-8 19:23
  • 签到天数: 137 天

    连续签到: 1 天

    [LV.7]测试师长

    3#
    发表于 2010-7-18 18:42:21 | 只看该作者
    关注!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2010-7-19 08:49:59 | 只看该作者

    没写过,学习中

    没写过,学习中
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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

    ftp_put应该也可以的,参数基本一样
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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”一样。
    现在就是想要在其中加入变量,请教下怎么能让他识别呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    7#
    发表于 2010-7-19 11:38:07 | 只看该作者
    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}中任一个文件。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

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



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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

    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 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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中不是指向某一具体文件,而是一个变量,这个变量是指随机的文件名。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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;
    }


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

    使用道具 举报

    该用户从未签到

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

    使用道具 举报

    该用户从未签到

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

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

    使用道具 举报

    该用户从未签到

    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 编辑 ]
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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能不能搞定不知道,试出来告诉你
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    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);


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

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-9-25 13:24 , Processed in 0.093528 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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