免费注册 查看新帖 |

Chinaunix

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

【求助高手】关于读取目录+批量改名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-23 14:34 |只看该作者 |倒序浏览
最近网上看片,想保存缓存里的flv格式文件,
但是其名字太长不易看清播放序号
所以动手写了个批量改名的程序
由于文件名长度远大于DOS的8.3格式形式
所以摈弃了TC改用VC

现碰到一个问题:
在while循环中 _findnext(handle,&f_block) 并改名放在同一目录的时候

改名后的文件还会被_findnext( )函数找到
从而"额外"执行了若干次
但是执行次数也不是双倍
比如我测试的时候是22个文件,
预想while体执行22次,实际上执行了22+18次
那额外的18次全是_findnext( )扫的改过名的文件
所以想请高手解释下:
1. _findnext( )函数底层是怎么执行判断的
2. 在目录文件变化的情况下(假设仅仅是改名,文件数量不变),while+_findnext( ) 循环体执行的次数和哪些因素相关。
谢谢


附上些原始的东西:
window缓存目录
C:\Documents and Settings\zzz\Local Settings\Temporary Internet Files\
待更名文件名实例:
02000114134739B04B87EA0011C0CF69C40D99-A873-1EF8-3A8D-C1FB9D1F2601[1].flv
其中第7、8位字符是16进制标识的序号,此处14表示它为第21个文件,目标就是将此文件改名为 xxxx-21.flv

// mul_rename.cpp : Defines the entry point for the console application.
#include "stdafx.h"

#include "direct.h"
#include "io.h"
#include "conio.h"
#include "iostream.h"
#include "string.h"

typedef struct _finddata_t FILE_BLOCK;

int main(int argc, char* argv[])
{
    FILE_BLOCK f_block;
    long handle;
    char new_name[50];
    int high,low,value;
    int count;
   
   
    cout<<"\n Begin scan... \n" ;
   
    _chdir("e:\\test\\");

    handle = _findfirst("*.flv", &f_block );

    if((handle == -1))
    {
        cout<<"Empty DIR.\n";
        return 0;
    }

    count=1;
    while ( strlen(f_block.name) )
    {

        if( (!memcmp(f_block.name,".",1)) || (!memcmp(f_block.name,"..",2)) )
            continue;
        cout<<f_block.name<<"\n";

        
        if( (f_block.name[7] >= '0') && (f_block.name[7] <= '9') ) //[0x30,0x39]

            high=f_block.name[7]-48;
        else if( (f_block.name[7] >= 'A') && (f_block.name[7] <= 'F') ) //[0x41,0x46]

            high=f_block.name[7]-55;
        else if( (f_block.name[7] >= 'a') && (f_block.name[7] <= 'f') ) //[0x61,0x66]

            high=f_block.name[7]-55-32;
        else
        {
            cout<<"Error value!!!\n";
            if( _findnext(handle,&f_block) )
             break;
            continue;
        }

        if( (f_block.name[8] >= '0') && (f_block.name[8] <= '9') ) //[0x30,0x39]

            low=f_block.name[8]-48;
        else if( (f_block.name[8] >= 'A') && (f_block.name[8] <= 'F') ) //[0x41,0x46]

            low=f_block.name[8]-55;
        else if( (f_block.name[8] >= 'a') && (f_block.name[8] <= 'f') ) //[0x61,0x66]

            low=f_block.name[8]-55-32;
        else
        {
            cout<<"Error value!!!\n";
            if( _findnext(handle,&f_block) )
             break;
            continue;
        }

        memset(new_name,0x00,sizeof(new_name));
        value=16*high+low+1; //start from 1

        sprintf(new_name,"ok\\%s%02d.flv","Head",value);
        cout<<new_name<<"\n";

        //rename here
        if( rename(f_block.name,new_name) )
        {
            cout<<" !!!rename err\n";
            //exit(1);
        }
        count++;

        if( _findnext(handle,&f_block) )
            break;

    }

    cout<<"\n End of directory listing. \n" ;
    cout<<" Total file dealed:" <<count<<"\n";
    _findclose(handle);

    //getch();
    return 0;
}

测试用例大家可以这样生成: 1.bat
echo 1>200011600473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011601473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011602473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011603473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011604473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011605473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011606473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011607473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011608473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>200011609473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>20001160A473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>20001160B473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>20001160C473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
echo 1>20001160D473DD8A6D9EA0011C0CFD4B05EAF-7A69-5E26-DD14-69DBDB0BD704[1].flv
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP