当前位置: 技术问答>linux和unix
!SUN的一道面试题,如何用程序实现支持通配符的文件及文件夹拷贝
来源: 互联网 发布时间:2015-09-17
本文导语: cp命令是linux下面的文件拷贝命令。现在要自己写一个C/C++程序来实现cp命令的功能,同时还要增强:一来要能支持路径拷贝,包括多级目录拷贝;二来要支持通配符拷贝。 大家帮忙给点思路,我想知道linux的文件组织...
cp命令是linux下面的文件拷贝命令。现在要自己写一个C/C++程序来实现cp命令的功能,同时还要增强:一来要能支持路径拷贝,包括多级目录拷贝;二来要支持通配符拷贝。
大家帮忙给点思路,我想知道linux的文件组织用的是什么样的数据结构,到时候好来实现这个程序。多谢各位啦!小弟送大分!
大家帮忙给点思路,我想知道linux的文件组织用的是什么样的数据结构,到时候好来实现这个程序。多谢各位啦!小弟送大分!
|
#define DIRCREATEMOD S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH
int file_copy(src,dest)
char *src;
char *dest;
{
FILE *fp=NULL;
int nsuccess;
char block[1024];
struct stat Judge;
int in=0;
int out=0;
int nread;
strcpy(source,src_file);
strcpy(dest,dest_file);
in=open(source,O_RDONLY);
out=open(dest,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
if(-1==out)
{
fp=fopen(dest,"w+");
if(fp==NULL)
{
goto ERROR_PROC;
}
else
{
fclose(fp);
fp=NULL;
}
}
out=open(dest,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
if(-1==out)
{
goto ERROR_PROC;
}
do
{
nread=read(in,block,sizeof(block));
if(nread>0)
{
write(out,block,nread);
}
}while(nread>0);
nsuccess=remove(source);
if(nsuccess)
{
goto END_OF_FUNC;
}
ERROR_PROC:
return(0);
END_OF_FUNC:
return(1);
}
int s_file_copy(dir_src, dir_dest)
char* dir_src ;
char* dir_dest ;
{
DIR *dp = NULL ;
int rc = NG ;
int rtn = NG ;
int flag = 0 ;
struct stat statbuf ;
struct stat destbuf ;
struct dirent *entry = NULL ;
char dest_file_name[MAXSIZE+1] ;
char src_file_name[MAXSIZE+1] ;
char dir_recursion[MAXSIZE+1] ;
if( ( dp = opendir( dir_src ) ) == NULL ) {
goto ERROR_PROC ;
}
while( ( entry = readdir( dp ) ) != NULL) {
rc = NG ;
sprintf( src_file_name, "%s/%s", dir_src, entry->d_name ) ;
lstat( src_file_name, &statbuf ) ;
if( S_ISDIR( statbuf.st_mode ) ) {
if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
rc = OK ;
continue ;
}
sprintf( dir_recursion, "%s/%s", dir_dest, entry->d_name ) ;
rc= stat( dir_recursion, &statbuf ) ;
if( rc != OK ) {
rc = mkdir(dir_recursion, DIRCREATEMOD ) ;
if( rc != OK ) {
break ;
}
}
rc = s_file_copy( src_file_name, dir_recursion) ;
if( rc != OK ) {
break;
}
} else if( S_ISREG( statbuf.st_mode ) ) {
sprintf( dest_file_name, "%s/%s", dir_dest, entry->d_name ) ;
rc = file_copy( src_file_name, dest_file_name ) ;
if( rc != OK ) {
break ;
}
}
rc = OK ;
}
ERROR_PROC:
if( dp != NULL ) {
closedir( dp ) ;
dp = NULL ;
}
return( rc ) ;
}
我以前的做项目时写的,我修改了很多地方,要不被公司发现了就完了,呵呵
你自己处理一下统配符吧,不太麻烦
int file_copy(src,dest)
char *src;
char *dest;
{
FILE *fp=NULL;
int nsuccess;
char block[1024];
struct stat Judge;
int in=0;
int out=0;
int nread;
strcpy(source,src_file);
strcpy(dest,dest_file);
in=open(source,O_RDONLY);
out=open(dest,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
if(-1==out)
{
fp=fopen(dest,"w+");
if(fp==NULL)
{
goto ERROR_PROC;
}
else
{
fclose(fp);
fp=NULL;
}
}
out=open(dest,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
if(-1==out)
{
goto ERROR_PROC;
}
do
{
nread=read(in,block,sizeof(block));
if(nread>0)
{
write(out,block,nread);
}
}while(nread>0);
nsuccess=remove(source);
if(nsuccess)
{
goto END_OF_FUNC;
}
ERROR_PROC:
return(0);
END_OF_FUNC:
return(1);
}
int s_file_copy(dir_src, dir_dest)
char* dir_src ;
char* dir_dest ;
{
DIR *dp = NULL ;
int rc = NG ;
int rtn = NG ;
int flag = 0 ;
struct stat statbuf ;
struct stat destbuf ;
struct dirent *entry = NULL ;
char dest_file_name[MAXSIZE+1] ;
char src_file_name[MAXSIZE+1] ;
char dir_recursion[MAXSIZE+1] ;
if( ( dp = opendir( dir_src ) ) == NULL ) {
goto ERROR_PROC ;
}
while( ( entry = readdir( dp ) ) != NULL) {
rc = NG ;
sprintf( src_file_name, "%s/%s", dir_src, entry->d_name ) ;
lstat( src_file_name, &statbuf ) ;
if( S_ISDIR( statbuf.st_mode ) ) {
if( strcmp( ".", entry->d_name ) == 0 || strcmp( "..", entry->d_name ) == 0 ) {
rc = OK ;
continue ;
}
sprintf( dir_recursion, "%s/%s", dir_dest, entry->d_name ) ;
rc= stat( dir_recursion, &statbuf ) ;
if( rc != OK ) {
rc = mkdir(dir_recursion, DIRCREATEMOD ) ;
if( rc != OK ) {
break ;
}
}
rc = s_file_copy( src_file_name, dir_recursion) ;
if( rc != OK ) {
break;
}
} else if( S_ISREG( statbuf.st_mode ) ) {
sprintf( dest_file_name, "%s/%s", dir_dest, entry->d_name ) ;
rc = file_copy( src_file_name, dest_file_name ) ;
if( rc != OK ) {
break ;
}
}
rc = OK ;
}
ERROR_PROC:
if( dp != NULL ) {
closedir( dp ) ;
dp = NULL ;
}
return( rc ) ;
}
我以前的做项目时写的,我修改了很多地方,要不被公司发现了就完了,呵呵
你自己处理一下统配符吧,不太麻烦
|
http://www.kingbrand.net/getbible/linux/a9.htm
|
用什么数据结构不太清楚,离要是很有兴趣的话,可以看内核啊
不过Linux提供文件目录函数,像opendir,readdir等应该可以满足离的要求了。
不过Linux提供文件目录函数,像opendir,readdir等应该可以满足离的要求了。
|
文件的Inode里维护着文件地址指针,直接操作指针即可.
|
http://www.lslnet.com/linux/docs/linux-3880.htm
说起来简单,做起来很难.
说起来简单,做起来很难.
|
用readdir,得到每个文件名,然后与通配符相比较,比较成功,拷贝,比较失败,转到下一个。
关键是通配符算法,比较麻烦,不过幸好网上有现存的。我可以到网上搜索一下。“regex.c”,应该可以找到。
关键是通配符算法,比较麻烦,不过幸好网上有现存的。我可以到网上搜索一下。“regex.c”,应该可以找到。