Buenas.
Me quede he quedado estancado y vengo a pedirles una pequeña ayudita.
No he podido lograr borrar un directorio del sistema, he leído que el mismo debe estar vacio (no contener ningún archivo dentro) para poder borrarse. Cuestión que por mas que elimine los archivos, esta porquería no se borra. (Linea 71)
Aquí el supuesto intento de código:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
WIN32_FIND_DATA datosArchivo;
HANDLE hArchivo, hDirArchivo;
int bEncontro, bDirEncontro;
DWORD dAtributos;
string sNombreArchivo, sPathArchivo, sPathDirArchivo;
string sPath = "C:/Recycler/*";
hArchivo = FindFirstFile(sPath.c_str(), &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
while(bEncontro != 0){
sPathArchivo.append(sPath.substr(0, sPath.length()-1));
sPathArchivo.append(sNombreArchivo);
dAtributos = GetFileAttributes(sNombreArchivo.c_str());
/* Si esta oculto lo desocultamos.
Pongo atributos normales porque si es READONLY no me deja borrarlo */
if((dAtributos & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN){
if(SetFileAttributes(sPathArchivo.c_str(), FILE_ATTRIBUTE_NORMAL) != 0)
cout << sNombreArchivo + " dejo de estar oculto." << endl;
}
// Eliminacion de porquerias
if(sNombreArchivo.find(".lnk", 0) != std::string::npos){
if(DeleteFile(sPathArchivo.c_str()) != 0){
cout << "El archivo ficticio: " << sNombreArchivo << " fue borrado con exito." << endl;
}
}else if(sNombreArchivo.find("autorun.inf", 0) != std::string::npos){
if(DeleteFile(sPathArchivo.c_str()) != 0){
cout << sNombreArchivo << " borrado." << endl;
}
}else if(sNombreArchivo.find("RECYCLER", 0) != std::string::npos){
if((dAtributos & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY){
if(SetCurrentDirectory(sPathArchivo.c_str()) != 0){
sPathDirArchivo = sPathArchivo + "/*";
hDirArchivo = FindFirstFile(sPathDirArchivo.c_str(), &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
while(bDirEncontro != 0){
//cout << sPathDirArchivo;
sPathDirArchivo.append(sPathArchivo);
sPathDirArchivo.append("/");
sPathDirArchivo.append(sNombreArchivo);
dAtributos = GetFileAttributes(sNombreArchivo.c_str());
if((dAtributos & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN ||
(dAtributos & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY){
if(SetFileAttributes(sPathDirArchivo.c_str(), dAtributos & ~FILE_ATTRIBUTE_NORMAL) != 0){
cout << sPathArchivo << " atributo READ_ONLY removido." << endl;
if(SetFileAttributes(sPathDirArchivo.c_str(), FILE_ATTRIBUTE_NORMAL) != 0){
cout << sPathDirArchivo + " dejo de estar oculto." << endl;
}
}
}
if(DeleteFile(sPathDirArchivo.c_str()) != 0){
cout << sPathDirArchivo << " borrado con exito." << endl;
}
sPathDirArchivo.clear();
bDirEncontro = FindNextFile(hDirArchivo, &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
}
if(RemoveDirectory(sPathArchivo.c_str()) != 0){
cout << "Directorio " << sNombreArchivo << " borrado con exito." << endl;
}
}
}
}
sPathArchivo.clear();
bEncontro = FindNextFile(hArchivo, &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
}
FindClose(hArchivo);
return 0;
}
Desde ya, muchas gracias.
Si tienes que borrar lo que tiene dentro, por qué no lo haces :o
Cita de: ivancea96 en 24 Marzo 2015, 13:33 PM
Si tienes que borrar lo que tiene dentro, por qué no lo haces :o
Los archivos dentro del subdirectorio que necesito los borra y este es el código que se encarga de hacerlo. El directorio queda vacio y aun no se borra :-X
if((dAtributos & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY){
if(SetCurrentDirectory(sPathArchivo.c_str()) != 0){
sPathDirArchivo = sPathArchivo + "/*";
hDirArchivo = FindFirstFile(sPathDirArchivo.c_str(), &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
while(bDirEncontro != 0){
//cout << sPathDirArchivo;
sPathDirArchivo.append(sPathArchivo);
sPathDirArchivo.append("/");
sPathDirArchivo.append(sNombreArchivo);
dAtributos = GetFileAttributes(sNombreArchivo.c_str());
if((dAtributos & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN ||
(dAtributos & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY){
if(SetFileAttributes(sPathDirArchivo.c_str(), dAtributos & ~FILE_ATTRIBUTE_NORMAL) != 0){
cout << sPathArchivo << " atributo READ_ONLY removido." << endl;
if(SetFileAttributes(sPathDirArchivo.c_str(), FILE_ATTRIBUTE_NORMAL) != 0){
cout << sPathDirArchivo + " dejo de estar oculto." << endl;
}
}
}
if(DeleteFile(sPathDirArchivo.c_str()) != 0){
cout << sPathDirArchivo << " borrado con exito." << endl;
}
sPathDirArchivo.clear();
bDirEncontro = FindNextFile(hDirArchivo, &datosArchivo);
sNombreArchivo = datosArchivo.cFileName;
}
Y si hay un directorio dentro del directorio? Tendrás que vaciarlo también.
Cita de: ivancea96 en 24 Marzo 2015, 15:04 PM
Y si hay un directorio dentro del directorio? Tendrás que vaciarlo también.
Deberia hacer una funcion recursiva pero no viene al caso, el virus recycler nunca me crea un subdirectorio dentro del directorio "RECYCLER". Solo archivos ejecutables.
¿En qué parte eliminas el directorio?
Cita de: ivancea96 en 24 Marzo 2015, 15:55 PM
¿En qué parte eliminas el directorio?
Justamente después de eliminar todos los archivos que haya dentro. Es decir, luego del while.
Agregue una linea de código de prueba antes de la finalizacion del programa para asegurarme de que no la este borrando antes de eliminar todo archivo contenido en el directorio pero no hay caso. No elimina nada.
RemoveDirectory("C:/Recycler/RECYCLER/");
Este es el error que me tira con GetLastError(); (?????????)
ERROR_SHARING_VIOLATION
32 (0x20)
The process cannot access the file because it is being used by another process.
Probaste a borrarlo en caso de que el directorio ya esté vacío, poniendo en el programa solo la parte de borrado del directorio?
Cita de: ivancea96 en 24 Marzo 2015, 16:22 PM
Probaste a borrarlo en caso de que el directorio ya esté vacío, poniendo en el programa solo la parte de borrado del directorio?
Si lo he probado, sigue saltando el mismo error.
Gracias por la perseverancia ;-)
Prueba a poner el directorio actual del ejecutable fuera de la carpeta.
Mientras que no encuentras solución, system("RD /S /Q ruta").
Cita de: ivancea96 en 24 Marzo 2015, 16:35 PM
Prueba a poner el directorio actual del ejecutable fuera de la carpeta.
Mientras que no encuentras solución, system("RD /S /Q ruta").
Lo ejecuto compilando y esta en otro directorio muy lejos.
Por mas que use la consola del sistema el error es el mismo, por lo menos aca esta traducido :xD
El proceso no tiene acceso al archivo porque está siendo utilizado por otro proceso
Puedo obviar que no hay ningún proceso con el archivo abierto, y que ningún ejecutable se ejecuta ahí ni nada no? xD
Probaste a borrar otra carpeta?
Todo esta muy claro aqui :-\ :¬¬, GetLastError te devuelve un error bastante simple ERROR_SHARING_VIOLATION:
Traduccion:
La carpeta no la puedes borrar pues algun otro proceso/tu propio proceso tiene un HANDLE con FILE_SHARE_READ como dwShareMode de la misma, y hasta que dicho manejador no sea cerrado o el proceso que contiene el recurso terminado, el SO te bloqueara cualquier peticion de borrado.
Solucion:
1- Encuentra el proceso que mantiene el manejador de la carpeta y terminalo. (Esto lo puedes hacer con ProcessExplorer o cualquier app similar)
1.2 - Si ningun otro proceso tiene un HANDLE a la carpeta abierto, entonces quiere decir que tu propia app es la que lo tiene abierto cuando intentas eliminarlo en tu codigo. Intenta usar el RemoveDirectory() justo despues que cierres el manejador con FindClose() que mantienes abierto desde la llamada FindFirstFile() a la carpeta, o verifica cualquier otro lugar donde puedes haber abierto un manejador a la misma y no lo has cerrado cuando llamas a RemoveDirectory().
2- Intenta ahora eliminar la carpeta (ten en cuenta q debe estar vacia, como ya sabes)
Saludos