2011-06-16 12 views
26

Existe la posibilidad de desbloquear un archivo que se descarga de Internet desde un programa C#. Navegando por Internet, he aprendido que la información está escrita en una secuencia alternativa de un archivo (NTFS) que contiene la información de la zona actual (el valor 3 proviene de Internet y se interpreta como bloqueado).Desbloquear archivo desde .net 4 C#

¿Hay una posibilidad gestionada de borrar o cambiar la información de la zona (desbloquear) de un archivo o existe una función de copia administrada que copia los archivos sin la información de la zona? Si no, ¿cómo puedo hacer con PInvoke pero sin incluir un ensamblaje extraño (no estoy autorizado a hacer esto en un proyecto actual).

+2

@Sven: Gracias: pensé que tengo exactamente esto escrito en mi pregunta. ¿Mi inglés es tan malo? Pero gracias de todos modos ... :) – HCL

+0

No, aparentemente mis habilidades de lectura son, sin embargo. :) En mi defensa, es después de la medianoche aquí. Por supuesto, tendrá que usar PInvoke, ya que las clases .Net System.IO no admiten flujos de datos alternativos. – Sven

+0

Ver http://stackoverflow.com/questions/604960/ntfs-alternate-data-streams-net – stuartd

Respuesta

15

Se almacena en la secuencia :Zone.Identifier (more < c:\theapp.exe:Zone.Identifier) necesita utilizar las rutinas nativas de IO para manipularlas, aquí hay un managed wrapper.

+2

Si bien esto puede funcionar por el momento, es un detalle de implementación. El [objeto Identificador de zona persistente] (https://msdn.microsoft.com/en-us/library/ms537029 (v = vs.85) .aspx), tal como lo menciona @citizenmatt, es el bit responsable de crearlos. Como tal, MS puede, en cualquier momento, a través de la actualización de Windows o la versión del sistema operativo, cambiar cómo/dónde se almacenan esos datos. –

28

En base a su entrada No he hecho el siguiente código:

public class FileUnblocker { 
    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool DeleteFile(string name); 

    public bool Unblock(string fileName) { 
     return DeleteFile(fileName + ":Zone.Identifier"); 
    } 
} 

Gracias a Stuart Dunkeld, Alex K (1) y Sven para mostrarme la dirección.

ACTUALIZACIÓN He publicado el código here para una retroalimentación si funcionaría fiable en el entorno de producción. Si alguien quiere usarlo, échale un vistazo.

+1

Actualizaciones como esta deben publicarse como una edición de su pregunta. –

Cuestiones relacionadas