[AYUDA] Borrar archivo en uso

Iniciado por Miseryk, 10 Abril 2014, 03:32 AM

0 Miembros y 6 Visitantes están viendo este tema.

Miseryk

Hola a todos, estoy tratando de lograr borrar un archivo en uso, alguno tiene idea de como poder lograrlo?

En realidad quiero lograr algo parecido a lo que hace el programa Unlocker, que desbloquea el archivo sin tener que cerrar la aplicación que lo está usando y lo mejor es que desde la otra aplicación el archivo se sigue visualizando.

Ej: un excel o un doc

Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Eternal Idol

Una forma de cerrar el HANDLE es usando DuplicateHandle con DUPLICATE_CLOSE_SOURCE.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Unlocker utiliza ambos y un driver o hacer lo que dijo EI.

Miseryk

Abrí el archivo WORD.xls
Usé el unlocker para ver el pid más el handle, que eran 8300 y 924
Ejecuté este código

Código (cpp) [Seleccionar]

int main()
{
DWORD source_pid;
HANDLE oldhandle;
bool success;

source_pid = 8300;
oldhandle = (HANDLE)924;

LPCSTR Path = "C:\\WORD.xls";

HANDLE source_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, source_pid);
HANDLE newhandle;
success = DuplicateHandle(source_handle, (HANDLE)oldhandle, GetCurrentProcess(), &newhandle, DUPLICATE_SAME_ACCESS, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
success = DeleteFile(Path);
CloseHandle(source_handle);
success = DeleteFile(Path);
CloseHandle(newhandle);
success = DeleteFile(Path);

return 0;
}


Luego de ejecutar este código, usé el unlocker de nuevo, ahora me mostraba "No locking handle found"

pero no puedo eliminar el archivo...

Alguno tiene idea?
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Eternal Idol

Fijate que devuelve GetLastError para empezar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Miseryk

DuplicateHandle retorna true los DeleteFile retornan false
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Eternal Idol

Si, llama a GetLastError despues de DeleteFile y fijate que valor devuelve esa funcion.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Miseryk

#7
Cita de: Eternal Idol en 14 Abril 2014, 22:11 PM
Si, llama a GetLastError despues de DeleteFile y fijate que valor devuelve esa funcion.

Devolvió el número 32.

Lo busqué y es ésto:

ERROR_SHARING_VIOLATION
32 (0x20)
The process cannot access the file because it is being used by another process.

Luego me dá el número 5.

ERROR_ACCESS_DENIED
5 (0x5)
Access is denied.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Eternal Idol

El ERROR_SHARING_VIOLATION primero tiene sentido, intenta borrar el archivo todavia teniendo el HANDLE en tu programa y el ERROR_ACCESS_DENIED es por no tener los permisos necesarios.

¿Una vez que cerras el HANDLE con tu programa y este termina podes borrar el archivo con el Explorador de Windows?
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Miseryk

Cita de: Eternal Idol en 14 Abril 2014, 23:06 PM
El ERROR_SHARING_VIOLATION primero tiene sentido, intenta borrar el archivo todavia teniendo el HANDLE en tu programa y el ERROR_ACCESS_DENIED es por no tener los permisos necesarios.

¿Una vez que cerras el HANDLE con tu programa y este termina podes borrar el archivo con el Explorador de Windows?

Una vez cerrado el handle no lo puedo borrar desde Windows, inclusive con el Unlocker, porque me muestra en AMBOS que el archivo ya no tiene un handle abierto, pero no se puede eliminar a mano, y para eliminarlo tengo que usar el unlocker con la accion delete, asumo que ahí se usa el driver del unlocker, ya que ambos pueden cerrar el handle y no se puede eliminar a mano. (programación o windows)
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!