Kernel: Obtendo os processos que estão usando um arquivo – C#

Pode parecer tarefa fácil, mas não é. O fato é que, obter o processo ou os processos que estão usando um arquivo/pasta é uma tarefa com uma pitada de complexidade em C++ e realmente complexa em C#/VB devido às diversas importações de funções necessárias.

No entanto, existe um utilitário gratuito que lhe permite descobrir essas coisas de forma super simples. Falo do Handle:

O Handle é um Console Application que faz todo o trabalho árduo; Você apenas especifica o caminho para um arquivo ou pasta e ele lhe retorna os processos que o estão usando.

Sendo assim, vou mostrar como usar este utilitário. Primeiro, obviamente faça o Download dele no link acima. Descompacte o arquivo zip e copie o arquivo Handle.exe para a pasta da sua aplicação. Então o poderá colocar em funcionamento o código abaixo:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;

namespace System.IO
{
    public static class Kernel
    {
        /// <summary>
        /// Returns all the processes locking a file/folder
        /// </summary>
        /// <param name="path">The full path to file/folder to inspect</param>
        /// <returns>A IEnumerable containing all the processes locking the file/folder</returns>
        public static IEnumerable<Process> GetProcessesLockingFile(string path)
        {
            string currentDirectory = System.IO.Path.GetDirectoryName(new Uri(
                System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);
            string handlePath = currentDirectory + "\\handle.exe";
            ProcessStartInfo handleStarting = new ProcessStartInfo(handlePath);
            handleStarting.UseShellExecute = false;
            handleStarting.RedirectStandardOutput = true;
            handleStarting.Arguments = "\"" + path + "\" /accepteula";
            handleStarting.Verb = "runas";
            handleStarting.CreateNoWindow = true;
            Process handleProcess = Process.Start(handleStarting);
            handleProcess.WaitForExit();

            string outputTool = handleProcess.StandardOutput.ReadToEnd();

            string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
            foreach (Match match in Regex.Matches(outputTool, matchPattern))
            {
                Process pr = null;
                try
                {
                    pr = Process.GetProcessById(int.Parse(match.Value));
                }
                catch { }
                if (pr != null)
                    yield return pr;
            }
            yield break;
        }
    }
}

Esse código, basicamente, executa o utilitário e faz a leitura do resultado convertendo-o em um Enumerable de processos que estão usando o arquivo/pasta.

Mas, devo salientar algo muito importante:

O fato de um programa abrir um arquivo não quer dizer que ele esteja usando este arquivo. Se você abrir uma música no Windows Media Player ele irá carregar o conteúdo do arquivo para a memória, fechar este arquivo e então reproduzir. No fim das contas o código não irá detectar nenhum programa usando este arquivo de música, pois, realmente, nenhum está utilizando.

O mesmo pode acontecer com qualquer arquivo, pasta e software…

E, de brinde, vou disponibilizar para download um projeto de um programa pequeno para inspecionar arquivos e pastas para saber se estão sendo usados:

File Locker.zip

That’s all folks!

Fonte: c# – How do I find out which process is locking a file using .NET? – Stack Overflow

Anúncios

Deixe um comentário :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s