26. december 2002 - 16:26Der er
9 kommentarer og 2 løsninger
Hvordan omdøber man en fil?
Jeg har en programstump, der skal omdøbe alle filer i en mappe. Hvilken kommando skal bruges til at omdøbe filerne?
// Programmet 'rename_files' går ned i den angivne mappe, og omdøber alle filer. // Den angivne mappe er altid "c:\Work\Soft\C++\filer" // Filerne får navnene asd003, asd006 asd009, asd012 osv. // Det vides ikke hvor mange filer der er i mappen. // Mapperne i mappen røres ikke. void rename_files(char *dir) { WIN32_FIND_DATA fd; HANDLE handle; char absPath[MAX_PATH]; char tempPath[MAX_PATH]; strcpy(tempPath, dir); strcat(tempPath, "\\*.*");
Det skyldes at rename ikke anbringer den nynavngivne fil i den mappe, filen lå i. Den anbringer den nynavngivne fil i samme mappe som C++ exe filen ligger i.
Men der er et andet problem. Når Jeg kører programmet med sprintf, så nøjes programmet ikke med at hente alle filerne og omdøde dem. Når programmet har været hele turen igennem, så starter det forfra og tager den første fil igen. Denne første fil omdøbes, og så stopper programmet. Dvs at en fil omdøbes to gange og alle andre filer omdøbes en gang. Jeg har kørt programmet med rename, og den gør det ikke. Den omdøber alle filer en gang. Men rename kan som sagt ikke bruges, fordi den flytter filerne hen i exe mappen.
// Funktionen laeg_tre_til lægge tre til den eksisterende filnavn. Rækken af // filnavne får udseendet: // asd003, asd006 asd009, asd012 osv. void omdoeb::laeg_tre_til(char * navn) { // Vi ved at filnavn altid består af 10 karakterer // Vi anbringer nu de tre cifre i en int variabel char et = navn[3] ; char to = navn[4] ; char tre = navn[5] ; int gammel = 0 ; gammel = gammel + ( 100 * ( ( (int) et ) - 48 ) ) ; gammel = gammel + ( 10 * ( ( (int) to ) - 48 ) ) ; gammel = gammel + ( 1 * ( ( (int) tre ) - 48 ) ) ; // Så lægger vi tre til gammel = gammel + 3 ; // Så konverteres til char // itoa(gammel, ny, 10); char ny[4] ; // hjkl << "Fra laeg_tre_til. Navn ser ud som: " << navn << "\n" ; // hjkl << "Fra laeg_tre_til. Gammel ser ud som: " << gammel << "\n" ; itoa (gammel, ny, 10) ; // hjkl << "Fra laeg_tre_til. Efter itoa. Ny ser ud som: " << ny << "\n" ; // hjkl << "Fra laeg_tre_til. Efter itoa. Gammel ser ud som: " << gammel << "\n" ; bool flag = 0 ; if ( (gammel < 10 ) && ( flag == 0 ) ) { ny[2] = ny[0] ; ny[1] = '0' ; ny[0] = '0' ; flag = 1 ; } if ( ( gammel < 100 ) && ( flag == 0 ) ) { ny[2] = ny[1] ; ny[1] = ny[0] ; ny[0] = '0' ; // flag = 1 ; } // hjkl << "Fra laeg_tre_til. Efter nulbehandling. \n" ; // hjkl << "Fra laeg_tre_til. Ny ser ud som: " << ny << "\n" ; // hjkl << "Fra laeg_tre_til. Gammel ser ud som: " << gammel << "\n" ;
// Så dannes det nye filnavn navn[3] = ny[0] ; navn[4] = ny[1] ; navn[5] = ny[2] ; // hjkl << "Fra laeg_tre_til. Nyt filnavn ser ud som: " << navn << "\n" ; }
// Programmet 'rename_files' går ned i den angivne mappe, og omdøber alle filer. // Den angivne mappe er altid "c:\Work\Soft\C++\filer" // Filerne får navnene asd003, asd006 asd009, asd012 osv. // Det vides ikke hvor mange filer der er i mappen. // Der må ikke ligge mapper i mappen. // Hvis der gør, så afbrydes programkørslen. // Der ligger muligvis for-filer i mappen. Disse for filer skal ikke røres. // Længden af filnavnet på for-filer kendes ikke. void omdoeb::rename_files(char *dir) { WIN32_FIND_DATA fd; HANDLE handle; char absPath[MAX_PATH]; char tempPath[MAX_PATH]; strcpy(tempPath, dir); strcat(tempPath, "\\*.*");
void omdoeb::stop_001(int tal) { cout << "\n\tDer er fundet en fejl. Stop nr " << tal << "." ; cout << "\n\tDer er en mappe i mappen." ; cout << "\n\n\tTryk RETUR for at afslutte programmet." ; getch() ; exit(1) ; }
Der er en fejl i koden. Rename er brugt og sprintf er remarket. Det er på grund af en test. I den kode jeg foretrækker at bruge, er sprintf brugt og rename er remarket
Hvis rename flytter filerne hen i current directory, så kan du jo enten putte sti på til-filnavnet eller lave en chdir til directoriet inden du bruger rename. Så skulle de gerne ende det rigtige sted.
Tak for alle svar og kommentarer. Programmet er færdigt og virker. Jeg endte med at bruge rename og lægge de omdøbte filer ned i en ny mappe.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.