ho una accozzaglia di file, se voglio
1)rendere minuscolo il nome
2)privarlo di caratteri diversi da lettere e numeri
3)il carattere che segue un carattere diverso da una lettera o un numero deve diventare maiuscolo
come faccio?
ps. mi ero scritto un programmino in c/c++ ma mi crasha senza apparente motivo. riporto di seguito il sorgente, magari a qualcuno passa per la testa di dargli un'occhiata
Codice: Seleziona tutto
/* massrename
* rinomina i file secondo uno specifico path, migliorando la legibilità dei nomi e togliendo
* caratteri che non siano lettere o numeri.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
#define tempfile ".massrenameTempFile"
/***************************************************************************************************
* DICHIARAZIONE DELLE FUNZIONI
*
* void usage();
* void dir (const char * directory);
* void move(const char * surce, const char * dest);
* bool valid(char c);
* bool processneded(const char * str);
* void downcase(char * str);
* char * catchextension(const char * sting);
* char * catchname(const char * sting);
* char * recopy(const char * str);
* void rename(const char * str);
*
* */
void usage();
void dir (const char * directory);
void move(const char * surce, const char * dest);
bool valid(char c);
bool processneded(const char * str);
void downcase(char * str);
char * catchextension(const char * str);
char * catchname(const char * str);
char * recopy(const char * str);
void rename(const char * str);
/***************************************************************************************************
* FUNZIONE MAIN
* */
int main (const int argc, const char * argv[])
{
if (argc==3 && (strcmp(argv[1],"-f")==0 || strcmp(argv[1],"-d")==0) ){
if (strcmp(argv[1],"-f")==0) {
char * tmp=new char [strlen(argv[2])+1];
strcpy(tmp,argv [2]);
char * nome = catchname(tmp);
if (processneded(nome))
rename(tmp);
delete [] tmp;
delete [] nome;
}
else {
char * current=get_current_dir_name();
char buffer[256];
dir(argv[2]);
ifstream f(tempfile);
chdir(argv[2]);
while (f.getline(buffer,256))
{
char * tmp = new char [strlen(buffer)+1];
strcpy(tmp,buffer);
char * nome = catchname(tmp);
if (processneded(nome))
rename(tmp);
delete [] tmp;
delete [] nome;
}
chdir(current);
remove(tempfile);
}
}
else usage();
return 0;
}
/***************************************************************************************************
* IMPLEMENTAZIONE DELLE FUNZIONI DICHIARATE
* */
/*
*
*/
void usage() {
cout <<"Uso : massrename [-d | -f] [directory | file]" <<endl
<<"-d : rename all internal directory's file;" <<endl
<<"-f : rename a file;" <<endl;
}
/*
*
*/
void move(const char * source,const char * dest) {
char * command = new char [strlen(source)+strlen(dest)+13];
strcpy(command,"mv ");
strcat(command,source);
strcat(command," ");
strcat(command,dest);
strcat(command," &");
system(command);
delete [] command;
}
/*
*
*/
void dir (const char * directory) {
char * comando = new char [strlen(directory)+strlen(tempfile)+15];
strcpy(comando,"dir -1 ");
strcat(comando,directory);
strcat(comando," > ");
strcat(comando,tempfile);
system(comando);
delete [] comando;
}
/*
*
*/
bool valid(char c) {
if ( (c>='0' && c<='9') || (c>='A' && c<='Z') || (c>='a' && c<='z') || c=='/' ) return true;
else return false;
}
/*
*
*/
bool processneded(const char * str) {
register unsigned int i=0;
while (i<strlen(str))
if (!valid(str[i]))
return true;
else i++;
return false;
}
/*
*
*/
void downcase(char * str) {
unsigned int l=strlen(str);
for (register unsigned int i=0; i<=l; i++)
if ( str[i]>='A' && str[i]<='Z' )
str[i] += 32;
}
/*
*
*/
char * catchextension(const char * str){
char * ext=0;
if (str[strlen(str)-4]=='.')
{
ext= new char [5];
for(int i=0; i<5;i++)
ext[4-i]=str[strlen(str)-i];
downcase(ext);
}
return ext;
}
/*
*
*/
char * catchname(const char * str) {
char * name=0;
char * ext = catchextension(str);
if (ext!=0) {
int dim = strlen(str)-strlen(ext);
name = new char [dim];
strncpy(name,str,dim);
name[dim]='\0';
delete [] ext;
}
else {
name = new char [strlen(str)+1];
strcpy(name,str);
}
downcase(name);
return name;
}
/*
*
*/
char * recopy(const char * str)
{
char * newstr= new char [strlen(str)+1];
for (register unsigned int i=0,j=0; i<strlen(str); i++)
{
if(valid(str[i]))
{
newstr[j]=str[i];
if (i>0 && !valid(str[i-1]) && !(newstr[j]>='0' && newstr[j]<='9') && (newstr[j]>='a' && newstr[j]<='z') )
newstr[j]-=32;
j++;
}
}
return newstr;
}
/*
*
*/
void rename(const char * str)
{
char * name=catchname(str);
char * ext=catchextension(str);
if (processneded(name))
{
char * newname=0;
newname=recopy(name);
if(ext!=0)
strcat(newname,ext);
move(str,newname);
delete [] newname;
}
}