Gleichnamige Dateien in verschiedenen Ordnern finden

Mahatmas

Mitglied
Hallo zusammen,

hab da gerade mal ein Problem. Und zwar hab ich ein bestimmtes Verzeichnis (z.B. "E:\Install"). Dieses Verzeichnis hat ca. 20 Unterordner (z.B. "CHI", "DEU", "ENG",...). In den jeweiligen Unterordner ist wiederum immer ein Ordner ("Disk00"), der die Datei "texte.pak" enthält. Hoff ich hab das einigermaßen klar ausgedrückt...
Jetzt will ich alle "texte.pak" umbenennen in "texte.p00". Mit einzelnen Aufrufen von allen Ordnern hintereinander bekomm ich das mit "rename(old,neu)" hin, jedoch heißen die ca. 20 Unterordner nicht immer gleich.
Wie kann ich trotzdem die Datei umbenennen?

So in etwa könnte es funktionieren, hab aber halt die Namen der CStrings "sprache" (also die Unterordner) nicht:
Code:
{
	CString path_sprache,path_neu;
	CString diskN    = "\\Disk00";
	CString texte    = "\\texte.pak";
	CString newtexte = "\\texte.p00";
	CString sprache  = "\\..\\";
	

	path_sprache = selectedPath+sprache+diskN+texte;
	path_neu     = selectedPath+sprache+diskN+newtext;
	rename(path_sprache, path_neu);
}

Gibt es da irgendeine Funktion, die alle Dateien eines Ordners findet, egal ob diese noch in Unterordnern unterteilt sind?

Wär super wenn mir da jemand helfen könnte. Sag schonmal Danke im vorraus...

Gruß,
Mahatmas
 
Mein Vorschlag wäre Folgender:
Code:
    CString strSearchPath("E:\\Install"), strOld, strNew;
    HANDLE hFind;
    WIN32_FIND_DATA FindFileData;

    hFind = FindFirstFile(strSearchPath, &FindFileData);
    if(hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if((strcmp(FindFileData.cFileName, ".") == 0) || (strcmp(FindFileData.cFileName, "..") == 0))
                    continue;
                else
                {
                    strOld = strSearchPath + CString("\\") + CString(FindFileData.cFileName) + CString("\\Disk00\\texte.pak");
                    strNew = strSearchPath + CString("\\") + CString(FindFileData.cFileName) + CString("\\Disk00\\texte.p00");
                    rename(strOld, strNew);
                }
            }
        }while(FindNextFile(hFind, &FindFileData));
        FindClose(hFind);
    }
Du kannst die Pfade und Namen natürlich dynamisieren.
 
Moin Moin,

erstmal Danke...
Das scheint schon mal der richtige Ansatz zu sein, denke ich...
Aber nach deiner Methode, ist strOld "E:\\Install\\Install\\Disk00\\texte.pak" und strNew "E:\\Install\\Install\\Disk00\\texte.p00". D.h. es werden nicht die Unterordner(CHI,DEU,...), sondern wieder der Ordner "Install" als CString(FindFileData.cFileName) angehängt.

Wie kann ich das Problem jetzt lösen? Er müsste beim Suchen noch ein Verzeichnis weiter gehen, oder?

Gruß,
Mahatmas
 
Also, ich hab den letzten Teil jetzt selbst gelöst...

Habe vor dem Durchsuchen noch bei "E:\\Install" ein "\\*" angehängt.
Aber beim Zusammensetzen des Pfads, also strOld und strNew, wieder weggelassen.

Hab zum Abschluss nochmal den Code angehängt:
Code:
{		
CString star = "\\*";
strSearchPath = selectedPath+star;
hFind = FindFirstFile(strSearchPath, &FindFileData);
		
if(hFind != INVALID_HANDLE_VALUE)
{
	do
	{
		if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if((strcmp(FindFileData.cFileName, ".") == 0) || (strcmp(FindFileData.cFileName, "..") == 0))
				continue;
			else
			{
				strOld = selectedPath + CString("\\") + CString(FindFileData.cFileName) + CString("\\Disk00\\texte.pak");
				strNew = selectedPath + CString("\\") + CString(FindFileData.cFileName) + CString("\\Disk00\\texte.p00");
				//AfxMessageBox(strOld);
				//AfxMessageBox(strNew);
				rename(strOld, strNew);
			}
		}
	}while(FindNextFile(hFind, &FindFileData));
	FindClose(hFind);
}
}

Also vielen Dank jokey2 für die Hilfe...

Bis demnächst (=

Mahatmas
 
Zurück