公司测试项目有时会需要用到特定大小的文件,比如说100MB,当然你完全可以去下载、拷贝,借助于winrar这样的分割工具去生成一个100M的文件大小。但是有没有更自动点的工具呢? 我在网上找了下大概有这么几个思路: 1. dd命令 Linux下的dd命令很是强大,我刚开始玩Linux的时候就知道的。可以这样使用dd命令来创建指定大小的文件: 生成固定大小文件 dd if=/dev/zero of=/home/bluestorm/100M.img bs=1M count=1024(生成一个100M的文件,文件名为100M.img) 使用的格式如下:(从sina.html文件读取1024Byte字节生成一个文本文件mm0.txt) “dd if=/home/sina.html of=/home/mms0.txt bs=1024 count=1” if的参数是输入文件是新浪的主页, of的参数是要生成的文件, bs的参数是每次读入的block大小,这里就设为要生成的文件大小, count的参数是读取的block个数,这里就设为1。 通过bs和count组合就可以生成指定大小的文件,根据if输入源的不同也内容也可以随机。 2. 编程 方法是写入文件流,并且在代码中给定串的大小(Nbyte)。当然,这样的话java, C++, C应该都可以做到。 3. 脚本 直接写一个windows下的批处理文件,或者用python这样的脚本语言写一个文件生成脚本。 比如:ping -l [数据包大小 最大65535] ip 使用Shell/Python生成一个内容不同但大小固定的文件 在测试一个上传场景时,需要保证每次拿到的文件内容不同,且脚本中需要用到文件的大小。 为了保证测试脚本足够简单,不希望每次在使用文件时还要去获取一下文件大小。 为了避免读取文件是文件大小被修改,尽量不要使用追加或删除的操作。 那么需求产生了:在保证文件大小一致的前提下来修改文件内容。 使用Shell脚本来完成此工作,生成文件的脚本:#!/bin/bash # 文件名:create_file.sh # 生成一定大小的文件 testfile=/data/share/filetest dd if=/dev/zero of=$testfile ibs=1000 obs=1000 count=100 echo -en "\n"$(uuidgen)"\n" >> $testfile 修改文件内容的方法:#!/bin/bash # 文件名:modify_file.sh # 将文件末行替换 while(test 1 -eq 1) do sleep 1 sed -i '$c\'`uuidgen` /data/share/filetest done OK,简单几行脚本就把事情的核心事务给解决了,剩下就是定时执行脚本即可了nohup ./modify_file.sh > /dev/null & 。 经测试,满足文件内容不同而文件大小固定的要求 ![]() ? 让人比较郁闷的一点是Shell时间最高只能精确到秒,要文件更新更快,要么使用另一种语言来调用上述的Shell脚本,要么就直接用第三方脚本重新实现了。 这里提供一个Python版本: #!/usr/bin/env python import sys,os import time import uuid def _gen_uuid(): u = uuid.uuid4() return str(u) def main(filename, filesize, change_per_second): f = open(filename, "wb") uuid = _gen_uuid() padding = "0" * (filesize-len(uuid) -1) + "\n" padding_length = len(padding) f.write(padding) f.write(uuid) f.flush() interval = 1.0 / change_per_second while True: start = time.time() f.seek(padding_length) uuid = _gen_uuid() f.write(uuid) f.flush() elapse = time.time() - start sleep_time = interval - elapse if sleep_time < 0: sleep_time = 0 time.sleep(sleep_time) f.close() if __name__ == "__main__": if len(sys.argv) != 4: print "Usage: python make_uuid_file.py /path/to/file filesize change_per_second" sys.exit(1) filename = sys.argv[1] filesize = int(sys.argv[2]) change_per_second = int(sys.argv[3]) if filesize < 36: print "filesize must > 36" sys.exit(1) main(filename, filesize, change_per_second) 可以优化的是把文件或共享目录放到内存(/dev/shm或新挂一块)里,然后使用samba共享之。 |
|