c++ - otra - guardar un archivo en una ruta especifica c#
¿Por qué la función RemoveDirectory no elimina la mayor parte de la carpeta? (3)
refiérase a: codeguru.com/forum/showthread.php?t=239271
Al usar la función siguiente para eliminar carpetas, todas las carpetas, subcarpetas y archivos se eliminan, excepto la carpeta que se encuentra en la parte superior. Digamos por la ruta c:/folder1/folder2
todo lo que se encuentra debajo de la folder2
se elimina a excepción de la folder2
.
BOOL DeleteDirectory(const TCHAR* sPath)
{
HANDLE hFind; // file handle
WIN32_FIND_DATA FindFileData;
TCHAR DirPath[MAX_PATH];
TCHAR FileName[MAX_PATH];
_tcscpy(DirPath,sPath);
_tcscat(DirPath,_T("//"));
_tcscpy(FileName,sPath);
_tcscat(FileName,_T("//*")); // searching all files
int nRet = 0;
hFind = FindFirstFile(FileName, &FindFileData); // find the first file
if( hFind != INVALID_HANDLE_VALUE )
{
do
{
if( IsDots(FindFileData.cFileName) )
continue; //if not directory continue
_tcscpy(FileName + _tcslen(DirPath), FindFileData.cFileName);
if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// we have found a directory, recurse
if( !DeleteDirectory(FileName) )
break; // directory couldn''t be deleted
}
else
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
_wchmod(FileName, _S_IWRITE); // change read-only file mode
if( !DeleteFile(FileName) )
break; // file couldn''t be deleted
}
}while( FindNextFile(hFind, &FindFileData) );
nRet = FindClose(hFind); // closing file handle
}
return RemoveDirectory(sPath); // remove the empty (maybe not) directory and returns zero when RemoveDirectory function fails
}
Cualquier ayuda para encontrar el problema es apreciada. Durante la depuración noté que la función FindClose
cerraba con éxito el manejador del archivo pero GetLastError
devolvía 32 ("El proceso no puede acceder al archivo porque lo está usando otro proceso"). Sin embargo, no tengo ni idea después de probar con el explorador de procesos.
Si bien puede eliminar un directorio de esta manera, es más sencillo dejar que el sistema lo haga por usted llamando a SHFileOperation
pasando FO_DELETE
. Recuerde que debe duplicar la terminación nula de la cadena que pasa a esta API.
Creo que debes cerrar el identificador del archivo antes de la llamada recursiva. Lo que significa que después de salir de la llamada recursiva, debe volver a configurar su identificador de archivo a algo apropiado.
SHFileOperation puede ser una mejor solución; Solo estoy respondiendo la pregunta del OP de por qué su código no funcionaba como estaba previsto.
Consulte: http: //www.codeguru.com/forum/archive/index.php/t-337897.html
A continuación se muestra el código para eliminar el directorio utilizando SHFileOperation
bool DeleteDirectory(LPCTSTR lpszDir, bool noRecycleBin = true)
{
int len = _tcslen(lpszDir);
TCHAR* pszFrom = new TCHAR[len+4]; //4 to handle wide char
//_tcscpy(pszFrom, lpszDir); //todo:remove warning//;//convet wchar to char*
wcscpy_s (pszFrom, len+2, lpszDir);
pszFrom[len] = 0;
pszFrom[len+1] = 0;
SHFILEOPSTRUCT fileop;
fileop.hwnd = NULL; // no status display
fileop.wFunc = FO_DELETE; // delete operation
fileop.pFrom = pszFrom; // source file name as double null terminated string
fileop.pTo = NULL; // no destination needed
fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user
if(!noRecycleBin)
fileop.fFlags |= FOF_ALLOWUNDO;
fileop.fAnyOperationsAborted = FALSE;
fileop.lpszProgressTitle = NULL;
fileop.hNameMappings = NULL;
int ret = SHFileOperation(&fileop); //SHFileOperation returns zero if successful; otherwise nonzero
delete [] pszFrom;
return (0 == ret);
}