我程序要实现的功能是:搜索d:根目录下的所有文件,然后在文件的后缀名加上"&"字符,把它复制在同一个目录下,复制文件我用的是API函数中的CopyFile(),复制根目录下的文件(如"d:\\hbb.txt\0")就出错,但复制根目录文件夹里的文件(如"d:\\hbb\\hbb.txt")却复制成功,下面附上我的源程序,请高手帮忙看看是什么回事??
Search_Directory()
{
long handle;
struct _finddata_t filestruct;
char path_search[_MAX_PATH];
handle = _findfirst("*", &filestruct);
if((handle == -1)) return;
if(::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY)
{
if( filestruct.name[0] != '.' )
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else //找到文件
{
// 先获得当前工作目录的全路径
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search); //复制文件,问题就出在这个函数里 } while(!(_findnext(handle,&filestruct)))
{
if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
{
if(*filestruct.name != '.')
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else
{
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search);
}
}
_findclose(handle);
// 最后结束整个查找工作
}Data_Change(char *Path_Name)
{
char pFrom[_MAX_PATH],pTo[_MAX_PATH];
strset(pFrom, '\0');
strset(pTo, '\0'); strcpy(pFrom, Path_Name);
strcpy(pTo, Path_Name);
strcat(pTo, "&"); CopyFile(pFrom, pTo, FALSE);
MessageBox("file copy finish");
}
Search_Directory()
{
long handle;
struct _finddata_t filestruct;
char path_search[_MAX_PATH];
handle = _findfirst("*", &filestruct);
if((handle == -1)) return;
if(::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY)
{
if( filestruct.name[0] != '.' )
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else //找到文件
{
// 先获得当前工作目录的全路径
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search); //复制文件,问题就出在这个函数里 } while(!(_findnext(handle,&filestruct)))
{
if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
{
if(*filestruct.name != '.')
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else
{
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search);
}
}
_findclose(handle);
// 最后结束整个查找工作
}Data_Change(char *Path_Name)
{
char pFrom[_MAX_PATH],pTo[_MAX_PATH];
strset(pFrom, '\0');
strset(pTo, '\0'); strcpy(pFrom, Path_Name);
strcpy(pTo, Path_Name);
strcat(pTo, "&"); CopyFile(pFrom, pTo, FALSE);
MessageBox("file copy finish");
}
{
// 先获得当前工作目录的全路径
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search); //复制文件,问题就出在这个函数里 }一点可能: _getcwd 在根目录下时,返回格式是怎样的?
"c:"还是"c:\\"?
我试过了,在根目录下执行_getcwd(path_search,_MAX_PATH)后path_search是"d:\",但执行了strcat(path_search,"\\")只有path_search就变成了"d:\\",为什么不是"d:\\\"???如何才能解决这个问题??
判断path_search是否为根目录:
char *str=strrchr(path_search,'\\');
if(*(str++)=='\0')//根目录
........
if (path_search[strlen(path_search)] != '\\')
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search); //复制文件,问题就出在这个函数里
调用Data_Change前,查查参数的值。
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search);
改成下面的
_getcwd(path_search,_MAX_PATH);
char c;
c=path_search[strlen(path_search)-1];
if(c!='\\')
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
Data_Change(path_search);
我试过了,在根目录下执行_getcwd(path_search,_MAX_PATH)后path_search是"d:\",但执行了strcat(path_search,"\\")只有path_search就变成了"d:\\",为什么不是"d:\\\"???在C里面要用'\\'来代表'\'因为'\'代表转义字符
建议你在 strcat(path_search,"\\") 之前判断一下 path_search 最后一个字符是不是'\\'(即'\')。如果是,就不用在后面加 '\'了。