北京理工大学 20981 陈罡
胡乱扫了一眼a1200的/bin目录,发现了里面有不少很有用的可执行程序。例如:tar,gzip,
unzip等等,这里我就对unzip在程序中的使用做一个简单的说明:
unzip程序可以用于解压缩zip格式的压缩文件包,加上适当的参数可以将文件包的内容解压到
指定的目录。这里只写几个对我们很有用的参数:
-q 也即quiet模式,让unzip不输出什么信息,这种模式可以广泛应用于脚本,或者将unzip
程序集成到别的程序中。
-o 也即over write,如果要解压的目录或者文件在手机上已经存在,使用该选项可以忽略
那些已经存在的文件,利用解压出来的文件内容直接覆盖已经存在的文件内容。
-d 就是directory了,意思是把解压出来的文件解压到什么地方,这里可以是绝对路径也可以
是相对路径。
举个例子,现在在手机的存储卡目录有一个叫a.zip的压缩包,我希望把它解压到
/mmc/mmca1/test目录下面,那么用命令行的方式应该采用如下命令:
# unzip -q -o ./a.zip -d /mmc/mmca1/test
呵呵,这些只是最基本的命令使用了,可能有的朋友会说,没人能那么方便的使用命令行环境
的,我们可以把这个操作集中到程序中去,这样既可以发挥手机内置unzip的强大功能,又可以
节约不少用于解压缩的代码,何乐而不为呢:
char * m_unzip_cmd[] = {
"unzip", "-q", "-o", "a.zip", "-d", "/mmc/mmca1/test", NULL
} ;
注意:这里必须要用NULL结束,不可缺少,这是由execvp函数决定的。
// fork a new process to unzip the file
if((m_unzip_pid = fork()) == 0) {
execvp(m_unzip_cmd[0],(char* const*)m_unzip_cmd) ;
exit(0) ;
} else {
//parent process
while(1) {
wait_val = waitpid(-1, &m_status, WNOHANG) ;
if(wait_val == 0) sleep(1) ;
else break ;
}
}
呵呵,这个while循环需要说明一下了,这里的pid不等于零的代码段,意思是进入了主进程,
waitpid用于在主进程中获得刚刚fork出来的子进程的状态,在此,子进程为一个的墓地就是
调用execvp函数,执行unzip的命令,如果子进程没有执行完毕,则waitpid(...)会返回0,
如果子进程执行完毕,waitpid会返回子进程的pid,如果子进程已经退出,那么waitpid会
持续返回-1。如果我们把wait_val的值输出的话,会看到如下的结果:
0 // 代表子进程没有结束(unzip运行中)
0
0
0
263 // 这里子进程刚刚结束
-1 // 这里代表已经没有子进程了,所以持续返回-1
-1
-1
可以利用这个while循环,制作一个阻塞型的unzip函数,解压指定文件到制定位置。
是不是很方便,如果看着上面的代码有困难的朋友,可以到网上查一下fork以及wait和waitpid
的函数定义和基本用法,就对上述使用一目了然了。
原本想更进一步,在解压zip的时候搞一个进度条什么的,后来经过真机测试,一个6.81M的含有多级
目录嵌套的zip文件,解压开始到结束,如果使用moto a1200 自带的unzip,仅需要6-8s,速度非常快。
如果用自己编译的unzip跑的话,速度要慢5-10s左右。由此看来,基本上可以不用进度条了,小的文件,
几乎一闪就解压完毕了。呵呵,在此不得不赞一下moto的硬件选型还是比较高的。
用上述方法就可以方便的调用a1200系统unzip程序,来为我们自己的程序服务了,是不是很酷?
阅读(3764) | 评论(5) | 转发(0) |