公司测试项目有时会需要用到特定大小的文件,比如说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共享之。
联系客服