Я предполагаю, что Вы используете что-то неуправляемое, потому что в управляемых платформах система (сборщик "мусора") заботится о фрагментации.
Для C/C++ можно использовать некоторое другое средство выделения, чем по умолчанию. (были alrady некоторые потоки о средствах выделения на stackowerflow).
кроме того, можно создать собственное хранение данных. Например, в проекте я в настоящее время продолжаю работать, у нас есть пользовательское устройство хранения данных (пул) для битовых массивов (мы храним их в большом непрерывном ломте памяти), потому что у нас есть многие из них, и мы отслеживаем фрагментацию "кучи" и дефрагментируем ее, когда фрагментация к большому.
Вы можете использовать FTS (3)
для просмотра всех файлов в папке с помощью C:
http://keramida.wordpress.com/2009/07/05 / fts3-or-избегая изобретать колесо /
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char** argv)
{
struct dirent *dp;
DIR *dfd;
char *dir ;
dir = argv[1] ;
if ( argc == 1 )
{
printf("Usage: %s dirname\n",argv[0]);
return 0;
}
if ((dfd = opendir(dir)) == NULL)
{
fprintf(stderr, "Can't open %s\n", dir);
return 0;
}
char filename_qfd[100] ;
char new_name_qfd[100] ;
while ((dp = readdir(dfd)) != NULL)
{
struct stat stbuf ;
sprintf( filename_qfd , "%s/%s",dir,dp->d_name) ;
if( stat(filename_qfd,&stbuf ) == -1 )
{
printf("Unable to stat file: %s\n",filename_qfd) ;
continue ;
}
if ( ( stbuf.st_mode & S_IFMT ) == S_IFDIR )
{
continue;
// Skip directories
}
else
{
char* new_name = get_new_name( dp->d_name ) ;// returns the new string
// after removing reqd part
sprintf(new_name_qfd,"%s/%s",dir,new_name) ;
rename( filename_qfd , new_name_qfd ) ;
}
}
}
Хотя я лично предпочел бы сценарий для выполнения этой работы, например
#!/bin/bash -f
dir=$1
for file in `ls $dir`
do
if [ -f $dir/$file ];then
new_name=`echo "$file" | sed s:to_change::g`
mv $dir/$file $dir/$new_name
fi
done
Я знаю, что за этот ответ меня проиграют, но ваша проблема идеально подходит для сценария оболочки (или .cmd скрипт), скрипт PHP или скрипт PERL. Выполнение этого на C - это больше работы, чем сама задача.
Ключевые функции: _findfirst, _findnext и _findclose
struct _finddata_t file_info;
char discard[] = "XYZ.com";
char dir[256] = "c:\\folder\\";
char old_path[256];
char new_path[256];
intptr_t handle = 0;
memset(&file_info,0,sizeof(file_info));
strcpy(old_path,dir);
strcat(old_path,"*.avi");
handle = _findfirst(old_path,&file_info);
if (handle != -1)
{
do
{
char *new_name = NULL;
char *found = NULL;
new_name = strdup(file_info.name);
while ((found = strstr(new_name,discard)) != 0)
{
int pos = found - new_name;
char* temp = (char*)malloc(strlen(new_name));
char* remain = found+strlen(discard);
temp[pos] = '\0';
memcpy(temp,new_name,pos);
strcat(temp+pos,remain);
memcpy(new_name,temp,strlen(new_name));
free(temp);
}
strcpy(old_path,dir);
strcat(old_path,file_info.name);
strcpy(new_path,dir);
strcat(new_path,new_name);
rename(old_path,new_path);
free(new_name);
}while(_findnext(handle,&file_info) != -1);
}
_findclose(handle);
fts
имеет приятный интерфейс, но это 4.4BSD и не переносится. (Недавно меня укусило какое-то программное обеспечение, зависящее от fts.) opendir
и readdir
менее интересны, но соответствуют стандартам POSIX и переносимы.