C++: Problem beim Umbenennen von Dateien



  • Hallo!

    Ich habe versucht ein kleines Programm zu entwickeln, das mir beim Umbenennen vieler Dateien helfen kann, weil ich mit der Windows-Konsole (also dieser Eingabeaufforderung) nicht klar gekommen bin. Ich bekomme jedoch eine Fehlermeldung (durch perror ), dass die Dateien nicht gefunden werden können oder nicht existieren. Da bin ich aber etwas verwirrt, weil es die Dateien gibt UND die Namen in der rename() -Funktion richtig sind. Könnt ihr mir bitte sagen, woran's liegt?

    Danke im Vorfeld!

    P.S. Bitte keine Alternativen zur Eingabeaufforderung oder zum Schreiben des eigenen Programms vorschlagen. Ich muss das Ding hier zu Ende machen 🙂

    #include "header.h"
    
    int getdir (string dir, vector<string> &files)
    {
    	DIR *dp;
    	struct dirent *dirp;
    
    	//get the path name out of the file
    	string pathName;
    
    	fstream pathFile("E:\\Mano\\Uni\\M.Sc\\HiWi\\EO-LDAS\\Daten\\NEU\\path.bt");
    	if (!pathFile) {	
    		cerr << "Die Input-Datei kann nicht geoeffnet werden!" << endl;
    		cin.get();
    		return -1;
    	}
    	else
    	{
    		getline(pathFile, pathName);
    	}
    
    	//get the new path name
    	string user_path;
    	cout << "Enter the path name: (press 0 for default path: " << pathName << ")" << endl;
    	cin >> user_path;
    
    	//edit user path name:
    	//user_path.replace("\\", '\\\\');		dazu: http://www.linuxtopia.org/online_books/programming_books/c++_practical_programming/c++_practical_programming_060.html
    
    	//write the new path name into a file
    
    	if (user_path == "0")
    	{
    		cout << "using default path name" << endl;
    
    		//string to const char*
    		const char *constPath;
    		constPath = pathName.c_str();
    
    		dp  = opendir(constPath);
    
    		while ((dirp = readdir(dp)) != NULL) {
    			files.push_back(string(dirp->d_name));
    		}
    		closedir(dp);
    	}
    	else 
    	{
    		//converting string to const char*
    		const char *constPath;
    		constPath = user_path.c_str();
    
    		dp  = opendir(constPath);
    
    		if (dp != NULL)
    		{
    			pathFile << user_path;
    			cout << "The new path is now: " << user_path << endl;
    
    			while ((dirp = readdir(dp)) != NULL) {
    				files.push_back(string(dirp->d_name));
    			}
    			closedir(dp);
    		}
    		else
    		{
    			cout << "Path doesn't exist." << endl;
    		}
    	}
    
        return 0;
    }
    
    int main()
    {
    	string addString;
    	string replaceString;
    
        string dir = string(".");
    	vector<string> files = vector<string>();
    
    	getdir(dir,files);
    
    	cout << endl << "String to add: " << endl;
    	cin >> addString;
    
    	cout << endl << "String to replace: " << endl;
    	cin >> replaceString;
    
    	for (unsigned int i = 2;i < files.size();i++) {
    		//cout << endl << "Listing all files..." << endl;
    		//cout << files[i] << endl;
    
    		string::size_type add_position;
    		add_position=files[i].find(replaceString);
    
    		if(add_position != string::npos) {
    
    			const char *oldFileName;
    			oldFileName = files[i].c_str();
    			cout << "oldFileName: " << oldFileName << endl;	//for debugging
    
    			string tempIrgendwas = files[i];	//for debugging
    			string tempFileName = tempIrgendwas.replace(add_position, replaceString.size(), addString);
    			//tempFileName = files[i].replace(4, 2, "8o33");
    			const char *newFileName;
    			newFileName = tempFileName.c_str();
    
    			cout << "file: " << oldFileName << " to " << newFileName << " long: " << replaceString.size() << " at pos: " << add_position << " with: " << addString << endl; //for debugging
    			int result = rename(oldFileName, newFileName);
    			if ( result == 0 )
    				cout << oldFileName << "\t>>\t" << newFileName << endl;
    			else
    				perror( "Error renaming file" );
    		}
    	}
    	cin.get();
    	cin.get();
        return 0;
    }
    


  • Zur Lösung kann man nicht viel sagen.

    Empfehlenswert wäre im ersten Schritt, den Pfad zu minimalisieren. z.B ganz simple auf E:\\ und dort mit einer test.txt zu arbeiten.

    int result = rename("E:\\test.txt", "E:\\foo.txt");
    

    Wenn das so funktioniert, muss es an den Pfaden liegen.

    Was steht denn in
    E:\\Mano\\Uni\\M.Sc\\HiWi\\EO-LDAS\\Daten\\NEU\\path.bt

    Sind dort die enthaltenen Backslash's auch escaped?



  • Danke für deine Hilfe. Der in der Datei enthaltenen backslahes im Pfad sind escaped und der Pfad ist auch nicht kürzer als der zur path.bt-Datei. Ich habe gerade eben herausgefunden, dass Dateinamen absoluten Pfad haben müssen. Das liegt wahrscheinlich daran, dass die exe nicht im Projektordner liegt. Also nochmal danke, BasicMan01 🙂 👍


Anmelden zum Antworten