Разблокировать файл из .net 4 c # - PullRequest
28 голосов
/ 16 июня 2011

Есть ли возможность разблокировать файл, который загружается из Интернета из программы ac #.В интернете я узнал, что информация записывается в альтернативном потоке файла (NTFS), который содержит информацию о текущей зоне (значение 3 из Интернета и интерпретируется как заблокированное).

Есть лиуправляемая возможность очищать или изменять информацию о зоне (разблокировать) файла или есть функция управляемого копирования, которая копирует файлы без информации о зоне?Если нет, то как я могу сделать с PInvoke, но без включения сторонней сборки (мне не разрешено делать это в текущем проекте).

Ответы [ 3 ]

33 голосов
/ 16 июня 2011

Исходя из вашего ввода, я сделал следующий код:

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");
    }
}

Благодаря Стюарту Данкелду, Алексу К (+1) и Свену, чтобы показать мне направление.

ОБНОВЛЕНИЕ Я разместил код здесь для обратной связи, если он будет работать надежно в производственной среде.Если кто-то хочет использовать это, проверьте там.

16 голосов
/ 16 июня 2011

Он хранится в потоке :Zone.Identifier (more < c:\theapp.exe:Zone.Identifier), вам нужно использовать собственные процедуры ввода-вывода для управления ими, вот управляемая оболочка .

6 голосов
/ 19 июля 2012

Официальным способом управления этим идентификатором является COM-объект PersistentZoneIdentifier: http://msdn.microsoft.com/en-us/library/ms537029(v=vs.85).aspx

...