简单问题求各位前辈指导,谢谢了
写一个工具,要求:
对指定路径下的文件(包括其所有子目录)进行操作,将文件名中含有”.”的字符转成”_”
例如:XXX/XXX/XXX 目录下有 “数学_7上 1.1 1 正数与负数的概念--T1.flv” 文件
转成:XXX/XXX/XXX 目录下 “数学_7上 1_1 1 正数与负数的概念--T1.flv”
[解决办法]
最后一个 点 后面是文件后缀名不能换,我的思路是弄一指针,先指向字符串的末尾,依次向前移动指针,越过第一个“.”,后面再有点则转为“_”。
[解决办法]
为达到你的目的,就必须访问目录文件,修改inode,你用java流程应该是一样的,“dirent.h”文件就是unix下访问目录inode的头,既然是linux下,你可以直接include这个文件,或者自己写一个
[解决办法]
C语言就会比较麻烦一些,需要从字符串的后面开始,一个字符一个字符的查找和替换。
[解决办法]
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
void dir_scan(char *path, char *file);
int count = 0;
int get_suffix(char *filename)
{
int len = 0;
int i = 0;
int offset = 0;
if(NULL == filename)
{
return 0;
}
len = strlen(filename);
for(i=0;i<len;i++)
{
if(filename[i] == '.')
{
offset = i;
}
}
return offset;
}
int replace_filename(char *filename)
{
int suffix = 0;
int i;
char *new_filename = (char *)malloc(strlen(filename) + 1);
if(NULL != new_filename)
{
strcpy(new_filename,filename);
}
else
{
return 0;
}
suffix = get_suffix(new_filename);
for(i=0;i<suffix;i++)
{
if(new_filename[i] == '.')
{
new_filename[i] = '_';
}
}
if(!strcmp(filename,new_filename))
{
rename(filename,new_filename);
}
}
void dir_scan(char *path, char *file)
{
struct stat s;
DIR *dir;
struct dirent *dt;
char dirname[1024];
char path_file[1024] = {0};
memset(dirname, 0, 1024 * sizeof (char));
strcpy(dirname, path);
if (lstat(file, &s) < 0)
{
printf("lstat error\n");
}
if (S_ISDIR(s.st_mode))
{
strcpy(dirname + strlen(dirname), file);
strcpy(dirname + strlen(dirname), "/");
if ((dir = opendir(dirname)) == NULL)
{
printf("opendir %s error\n", dirname);
exit(4);
}
if (chdir(file) < 0)
{
printf("chdir error\n");
exit(5);
}
while ((dt = readdir(dir)) != NULL)
{
if (dt->d_name[0] == '.')
{
continue;
}
dir_scan(dirname, dt->d_name);
}
if (chdir("..") < 0)
{
printf("chdir error\n");
exit(6);
}
closedir(dir);
}
else
{
sprintf(path_file,"%s%s\n", dirname, file);
replace_filename(path_file);
count++;
}
}
[解决办法]
上次编译apue的源码写过个和你这个不太一样,你只要逐个扫描文件名,扫描到.替换就行了吧
#include"stdio.h"
#include"stdlib.h"
#include"fcntl.h"
#include"dirent.h"
#include"string.h"
void dircreate()
{
DIR *mydir;
char cmd[50];
struct dirent *myitem;
mydir = opendir("/home/apue/");
while( ( myitem = readdir(mydir) ) != NULL )
{
if( ( strcmp(myitem->d_name,".") == 0 )
[解决办法]
( strcmp(myitem->d_name,"..") == 0) )
{
continue;
}
memset( cmd, 0, 50 );
sprintf( cmd, "mv /home/apue2/%s /home/apue2/%s.c",myitem->d_name,&myitem->d_name[3]);
system(cmd);
}
}
int main()
{
dircreate();
return 0;
}