Usando SHGetSpecialFolderPath+SubFolder con SHFileOperation
Pregunta
quiero borrar la carpeta C:\Users\username\AppData\Roaming\appname
cuando los usuarios desinstalan la aplicación appname
.
Primero, uso el siguiente código para obtener la ruta. C:\Users\username\AppData\Roaming
:
TCHAR dir[MAX_PATH];
dir[0] = '\0';
BOOL ok = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, TRUE);
nombre de aplicación se define como _T("appname")
La primera pregunta es: How to append "appname" to "dir"?
Supongamos que se hace lo anterior.Entonces necesito usar SHFileOperation
para eliminar la carpeta que no está vacía C:\Users\username\AppData\Roaming\appname
.Entonces necesito una cadena doble terminada en nulo en un SHFILEOPSTRUCT
estructura.Entonces
How to get a double null-terminated string from the result of the first step? Just append _T("\0\0") to it?
Actualizar:Puedo usar TCHAR *dir2 = lstrcat(dir, appname);
para conseguir el camino.Pero cuando intenté usar TCHAR *dir3 = lstrcat(dir2, _T("\0\0"));
, la carpeta no se elimina.Cualquier numero de \0
no funcionará.
PD:
Si hago lo siguiente directamente, lo hago funcionar.El problema es que quiero que sea independiente del usuario.
TCHAR path[] = _T("C:\\Users\\username\\AppData\\Roaming\\appname");
memcpy(path + sizeof(path) / sizeof(TCHAR) - 1, _T("\0\0\0"), 3);
Solución
Para agregar rutas, consulte Agregar ruta función.
TCHAR dir[MAX_PATH] = {0};
BOOL ok = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, TRUE);
PathAppend(dir, _T("appname"));
Si desea garantizar la terminación doble nula de directorio variable:
dir[MAX_PATH - 1] = 0;
dir[MAX_PATH - 2] = 0;