欢迎访问个人小站阅读此文 http://www.yandong.org/archives/416
libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件。支持的文件系统包括: all known types of Linux filesystem (ext2/3/4, XFS, btrfs, etc.), any Windows filesystem (VFAT and NTFS), any Mac OS X and BSD filesystems, LVM2 volumes, MBR and GPT disk partitions, raw disks, qcow2, CD and DVD ISO images, SD cards, and dozens more. libguestfs 不需要root权限。
</
div
>
<
div
>
/**
*功能 : 判断是否为目录
*参数 :
* */
int
IS_DIR(
const
char
* path)
{
struct
stat st;
lstat(path, &st);
return
S_ISDIR(st.st_mode);
}
/**
*功能 : 遍历文件夹的递归核心
*参数 :
* */
void
guestfs_upload_dir_core(guestfs_h *g,
char
*remoteDir,
const
char
*path,
int
preOffset,
int
recursive)
{
DIR *pdir;
struct
dirent *pdirent;
char
temp[256];
char
remotePath[256];
pdir = opendir(path);
if
(pdir)
{
while
( (pdirent = readdir(pdir)))
{
//跳过"."和".."
if
(
strcmp
(pdirent->d_name,
"."
) == 0
||
strcmp
(pdirent->d_name,
".."
) == 0)
continue
;
sprintf
(temp,
"%s/%s"
, path, pdirent->d_name);
//printf("%s\n", temp);
sprintf
(remotePath,
"%s%s"
,remoteDir, temp+preOffset);
//当temp为目录并且recursive为1的时候递归处理子目录
if
(IS_DIR(temp) && recursive)
{
printf
(
"mkdir %s\n temp=%s\n"
, remotePath, temp);
guestfs_mkdir (g, remotePath);
guestfs_upload_dir_core(g,remoteDir,temp, preOffset,recursive);
}
else
if
( recursive )
{
printf
(
"[2]%s--->%s\n"
, temp,remotePath);
guestfs_upload(g, temp, remotePath);
}
}
}
else
{
printf
(
"opendir error:%s\n"
, path);
}
closedir(pdir);
}
/**
*功能 : 使用guestfs函数上传文件夹
*参数 : remoteDir为远段目录,格式为"/WINDOWS",注意斜杠的使用,必须以斜杠开头,结尾不能有斜杠
* path为本地目录,格式为"./split" ,可以使用绝对路径,也可以使用相对路径,结尾不能有斜杠
* preOffset为path的本地前缀长度,如"./split"的preOffset的值为1,从0计数为最后一个'/'的位置。
* preOffset是方便字符串链接的 即将"./split"中的"split"和remoteDir链接,产生远端的文件路径。
* recursive设置递归遍历文件夹
* TODO :可以对文件路径中多余的'/'进行处理,这样就不用纠结结尾不能有斜杠了
* */
void
guestfs_upload_dir(guestfs_h *g,
char
*remoteDir,
const
char
*path,
int
preOffset,
int
recursive)
{
int
len;
char
temp[256];
char
remotePath[256];
//去掉末尾的'/'
len =
strlen
(path);
strcpy
(temp, path);
if
(temp[len - 1] ==
'/'
) temp[len -1] =
'\0'
;
sprintf
(remotePath,
"%s%s"
,remoteDir, temp+preOffset);
if
(IS_DIR(temp))
/*处理目录*/
{
printf
(
"mkdir %s\n temp=%s\n"
, remotePath, temp);
guestfs_mkdir (g, remotePath);
guestfs_upload_dir_core(g,remoteDir,temp, preOffset,recursive);
}
else
/*输出文件*/
{
printf
(
"[1]%s--->%s\n"
, path,remotePath);
guestfs_upload(g, temp, remotePath);
}
}
|
其中preOffset的计算大致如下:
</pre>
char
temp[]=
" ..."
;
preOffset=
strlen
(tmp)-1;
while
(tmp[preOffset]!=
'/'
&& tmp[preOffset]!=
'\\'
)
{
preOffset--;
}
<pre>
|