免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3841 | 回复: 5
打印 上一主题 下一主题

批量修改文件名问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-21 15:44 |只看该作者 |倒序浏览
代码开始:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>

int readfile(char *dirname);
int main(int argc, char**argv)
{
        if(argc != 2)
        {
                printf("Usage: test dirname\n");
                return -1;
        }
        readfile(argv[1]);
        return 0;
}

int readfile(char *dirname)
{
        char dStr[1024];
        DIR *dSource;
        struct dirent *file;
        char cmd[2048];
        char newname[1024];

        memset(dStr, 0, sizeof(dStr));
        if((dSource = opendir(dirname)) != NULL)
        {
                while((file = readdir(dSource)) != NULL)
                {
                        if((strcmp(file->d_name, ".") != 0) && (strcmp(file->d_name,"..") != 0))
                        {
                                snprintf(dStr, sizeof(dStr)-1, "%s/%s", dirname, file->d_name);
                                readfile(dStr);
                        }
                }
        }
        else
        {
                snprintf(newname, sizeof(newname)-1, "%s%s", dirname, ".ok");
                snprintf(cmd, sizeof(cmd)-1, "mv %s %s", dirname, newname);
                //system(cmd);
                printf("%s\n", cmd);
                //memset(newname, 0, sizeof(newname));
        }
        return 0;
}
代码完
症状:
不打开system(cmd);
打印语句正常
打开了就会出问题,会多执行一些修改文件名命令。
目录里面的文件需要2000个以上才会出此症状

论坛徽章:
0
2 [报告]
发表于 2007-05-21 16:34 |只看该作者
自己顶一下

论坛徽章:
0
3 [报告]
发表于 2007-05-21 17:18 |只看该作者
opendir用法有问题吧。

试试下面这样用,看行不行
if( ( dSource = opendir( dirname ) ) != NULL )
{
    while( ( file = readdir( dSource ) ) != NULL )
    {
        if( ( strcmp( file->d_name, "." ) == 0 ) || ( strcmp( file->d_name, ".." ) == 0 ) )
        {
            continue;
        }
        memset( dStr, 0, sizeof( dStr ) );
        snprintf(dStr, sizeof(dStr)-1, "%s/%s", dirname, file->d_name );

        snprintf(newname, sizeof(newname)-1, "%s%s", dStr, ".ok");
        
        memset( cmd, 0, sizeof(cmd) );
        snprintf(cmd, sizeof(cmd)-1, "mv %s %s", dStr, newname);
        system(cmd);
        printf("%s\n", cmd);
        memset(newname, 0, sizeof(newname));
    }
}
closedir( dSource );

论坛徽章:
0
4 [报告]
发表于 2007-05-21 17:59 |只看该作者
我靠,这种功能用perl多好啊

论坛徽章:
0
5 [报告]
发表于 2007-05-22 10:28 |只看该作者
谢谢两位;
to:beacalmer
我是同时支持无限级目录的,所以要用递归
to:baohuaihuai
这个函数是我一个工程里的一个func,所以不能用perl

已经搞定
原来是这样的:
我是批量修改文件名的,当文件足够多的时候,
使用readdir读一个目录永远不为NULL,
因为修改了文件名,readdir认为有新文件了。

[ 本帖最后由 maco2004 于 2007-5-22 10:32 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-05-22 10:47 |只看该作者
如果在linux/unix环境下,可以直接用rename这个库函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP