首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

简单有关问题求各位前辈指导,多谢了

2013-01-05 
简单问题求各位前辈指导,谢谢了写一个工具,要求:对指定路径下的文件(包括其所有子目录)进行操作,将文件名

简单问题求各位前辈指导,谢谢了
写一个工具,要求:

对指定路径下的文件(包括其所有子目录)进行操作,将文件名中含有”.”的字符转成”_” 

例如:XXX/XXX/XXX 目录下有 “数学_7上 1.1 1 正数与负数的概念--T1.flv” 文件
转成:XXX/XXX/XXX 目录下   “数学_7上 1_1 1 正数与负数的概念--T1.flv” 

[解决办法]
最后一个 点  后面是文件后缀名不能换,我的思路是弄一指针,先指向字符串的末尾,依次向前移动指针,越过第一个“.”,后面再有点则转为“_”。
[解决办法]

引用:
引用:C/C++ code?1234567891011121314151617181920212223242526#include <dirent.h>int    main(int argc, char *argv[]){    DIR *dp;    struct dirent *dirp;    if (argc != 2)    {……


为达到你的目的,就必须访问目录文件,修改inode,你用java流程应该是一样的,“dirent.h”文件就是unix下访问目录inode的头,既然是linux下,你可以直接include这个文件,或者自己写一个
[解决办法]
C语言就会比较麻烦一些,需要从字符串的后面开始,一个字符一个字符的查找和替换。

引用:
引用:用Shell脚本会比较直接,类似于以下的写法,更改sed中的正则表达式:
Plain Text code?12345   1. for file in `ls`     2. do     3.   newfile =`echo $i 
[解决办法]
 sed 's/^./q/'`     4.  mv $file $newfile     5.……

[解决办法]
#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;
}

热点排行