понедельник, 9 июля 2012 г.

C# Как узнать процесс, который блокирует доступ к файлу

Чтобы заблокировать любой файл в ОС Windows его достаточно открыть на редактирование. Если быть точнее, это можно назвать процессом записи. Если рассмотреть работу текстовых редакторов, то при работе с текстом наш файл будет открываться только в момент сохранения и тут же закрываться. Мы рассматриваем случай, когда закрытия не произошло.

Такой ход могут использовать вредоносные программы, когда один процесс держит открытыми сразу все файлы, созданные вирусом, но современные антивирусники умеют обходить такую защиту и с лёгкостью закрывают файлы, после чего удаляют, за исключением тех случаев, когда вирус повреждает программные элементы антивирусника.

Также это могут быть просто системные файлы и их охраняет системный процесс, который как правило не видно в диспетчере задач. С этим будет по сложнее.

Лично мне это понадобилось для удаления Cookies из IE, но этот способ оказался слишком сложный и я предпочёл другой (об этом с другой статье).

Использовал утилиту созданную Майкрософтом - Handle v3.46, терминальная программа в виде ексешника, легка в использовании.
В обычном виде возвращает результат такого типа:
Пример использования:

        private void GET_PROCSS(string name)
        {                                    
            ProcessStartInfo start = new ProcessStartInfo();
            Process pr = new Process();
            //handle.exe уже добавлен в проект
            pr.StartInfo.FileName = @"handle.exe";
            pr.StartInfo.Arguments = @"-a " + name;
            pr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            pr.StartInfo.RedirectStandardOutput = true;
            pr.StartInfo.UseShellExecute = false;
            pr.Start();
            using (StreamReader reader = pr.StandardOutput)
            {
                //Удаляем лишнее (можно по своему)
                string result = (((((reader.ReadToEnd()
                    .Replace("Handle v3.46", ""))
                    .Replace("Copyright (C) 1997-2011 Mark Russinovich", ""))
                    .Replace("Sysinternals - www.sysinternals.com", ""))
                    .Replace("\r\n\r\n\r\n\r\n\r\n", ""))
                    .Replace("pid:", ""))
                    .Replace("type:", "");
                
                ///Далее делаем обработку данныз как хотим  
             }        
        }
Как и во всех случаях, даю исходник готовой программы, которая умеет много. Наглядный пример, как использовать эту небольшую утилиту.

Halter.rar   1.2 MB

0 коммент.:

Отправить комментарий

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |