- 论坛徽章:
- 0
|
最近网上看片,想保存缓存里的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 |
|
|