struct TMPMAP {
int Indx;
SHNAMEMAPPING *pMapping;
};
Nachfolgend wird der Zugriff auf die SHNAMEMAPPING-Strukturen über eine temporäre Variable des Typs TMPMAP realisiert, die auf den Buffer hNameMappings verweist.
TMPMAP *pTmpMap = (TMPMAP*)shFileOp.hNameMappings;
Nach diesem Cast kann eine einfache Schleife eingesetzt werden, die über den Wert von Indx der TMPMAP-Struktur läuft.
for(int in = 0; in < pTmpMap->Indx; in++)
{
SHNAMEMAPPING *pMap = &pTmpMap->pMapping[in];
Für alle Indizes müssen der alte und neue Pfad ermittelt werden. Da ein Aufruf der Form
strcpy(buf, (char*)pMap->pszOldPath);
nicht funktioniert, werden die einzelnen Zeichen in einer Schleife in den lokalen Buffer kopiert.
char *buf = csNewPath.GetBufferSetLength(pMap->cchNewPath);
for(int dw = 0 ; dw < 2 * pMap->cchNewPath - 1 ; dw+=2)
{
*buf = (pMap->pszNewPath[dw]);
buf++;
}
buf = 0;
csNewPath.ReleaseBuffer();
Analog zum vorgestellten Codeblock ist auch der String pszOldPath zu übernehmen, was man sich aber sparen kann, wenn die Namen aus der Liste pFrom übernommen werden.
Anschließend kann die Anwendung geeignete Maßnahmen für das Behandeln der Namenskollisionen ergreifen. Dies erfolgt hier innerhalb der for-Schleife, die über Indx läuft und ist sehr individuell, so dass hier auf die Darstellung verzichtet wird, da letztlich jede Anwendung und jeder Anwender anders reagieren wird, wenn das System Dateinamen unplanmäßig ändert. Prinzipiell ist eine Reaktion eigentlich nur dann notwendig, wenn die Anwendung eine Liste der Dateien verwaltet und den exakten neuen Namen kennen muss.
Zum Abschluss ist dann jedoch der Buffer hNameMappings wieder freizugeben.
SHFreeNameMappings(shFileOp.hNameMappings);
|