Trabalhando com variáveis de ambiente

novembro 29, 2016 12:00 pm Publicado por Deixe um comentário

Neste artigo, vou apresentar conceitos relacionados às variáveis de ambiente e mostrar como podemos tratá-las em um programa usando a linguagem C#.

A classe Environment pode ser usada para obter informações sobre o ambiente atual da plataforma na qual estamos trabalhando.

Ela pode ser usada para recuperar informações como argumentos de linha de comando, o código de saída, as configurações de variável de ambiente, conteúdo da pilha de chamadas, tempo desde a última inicialização do sistema e a versão do Common Language Runtime (CLR).

O método GetEnvironmentVariable(String) recupera uma variável de ambiente do bloco de ambiente do processo atual, que inclui as seguintes variáveis de ambiente:

  • Todas as variáveis de ambiente por máquina (Machine), que são definidas no momento em que o processo é criado, junto com seus valores;
  • Todas as variáveis de ambiente por usuário (User), que são definidas no momento do processo é criado, junto com seus valores;
  • Qualquer variável adicionada ao bloco do processo enquanto o processo estiver sendo executado pela chamada de SetEnvironmentVariable(String, String) ou SetEnvironmentVariable(String, String, EnvironmentVariableTarget), com um valor alvo de EnvironmentVariableTarget.Process.

Para recuperar todas as variáveis de ambiente junto com seus valores, chame o método GetEnvironmentVariables (nomes de variável de ambiente não diferenciam maiúsculas de minúsculas).

A enumeração EnvironmentVariableTarget pode ser usada por determinadas sobrecargas dos métodos SetEnvironmentVariable, GetEnvironmentVariable, e GetEnvironmentVariables para especificar o local ou o destino, onde o nome e o valor de uma variável de ambiente é armazenado ou recuperado.

O destino pode ser um dos três locais:

  • O bloco de ambiente associado com o processo atual;
  • A chave de registro de sistema operacional Windows reservada para variáveis de ambiente associadas ao usuário atual;
  • A chave de registro reservada para variáveis de ambiente associadas a todos os usuários na máquina local.

Neste artigo, vamos criar um exemplo que mostra como usar esses recursos para editar caminhos de variáveis de ambiente.

Recursos usados: Visual Studio Community 2015

Criando o projeto no VS 2015 Community

Abra o VS Community 2015 e clique em New Project. Selecione a linguagem Visual C# e o template Windows Forms Application. Depois informe o nome PathEditor e clique no botão OK.

No formulário form1.cs, inclua a partir da ToolBox os seguintes controles:

  • 1 GroupBox
  • 3 RadioButtons : radUser, radProcess e radMachine
  • 1 Listbox – lbEntradas
  • 1 TextBox – txtValorAtual
  • 1 Button – btnProcurar
  • 6 Buttons – btnExportar , btnAtualizar, btnDeletar, btnIncluir, btnOK e btnCancelar
  • 1 FolderBrowserDialog

Disponha os controles conforme o leiaute da figura abaixo:

c_varamb11

A seguir, vamos definir 03 métodos no formulário form1.cs:

  • ObtemCaminhoVariavel – usa o método GetEnvironmentVariable() para recuperar as variáveis de ambiente do bloco de ambiente do processo atual;
  • DefineCaminhoVariavel – usa o método SetEnvironmentVariable() para criar, modificar ou excluir uma variável de ambiente armazenada no processo atual;
  • CriarCaminhoVariavel – Obtém o caminho da variável.
private void ObtemCaminhoVariavel()
    {
      string valor = "";     
      try
      {
        valor = Environment.GetEnvironmentVariable("Path", Alvo);
      }
      catch (SecurityException)
      {
        MessageBox.Show("Você não tem permissão para realizar esta operação.nExecute o programa como Administrador");
      }
      if (valor != "")
      {
        string[] item = valor.Split(new char[]{Path.PathSeparator}, StringSplitOptions.RemoveEmptyEntries);      
        lblEntradas.Items.Clear();
        lblEntradas.Items.AddRange(item);
        lblEntradas.SelectedIndex = 0;
      }
    }
    private void DefineCaminhoVariavel()
    {
      string valor = CriarCaminhoVariavel();
      try
      {
        Environment.SetEnvironmentVariable("Path", valor, Alvo);
      }
      catch (SecurityException)
      {
          MessageBox.Show("Você não tem permissão para realizar esta operação.nExecute o programa como Administrador");
      }
    }
    private string CriarCaminhoVariavel()
    {
      string value = String.Empty;
      foreach (Object o in lblEntradas.Items)
        value += o.ToString() + Path.PathSeparator;
      return value;
    }

Nota: A classe Split retorna um array de única dimensão contendo o número de substrings separadas no processo dependendo do critério e delimitador usado.

A seguir, vamos definir o método Alvo que retorna o tipo de processo sobre o qual as informações serão retornadas: Machine, Process ou User:

 public EnvironmentVariableTarget Alvo
    {
      get
      {
        if (radMachine.Checked)
          return EnvironmentVariableTarget.Machine;
        else if (radProcess.Checked)
          return EnvironmentVariableTarget.Process;
        else
          return EnvironmentVariableTarget.User;
      }
    }

A seguir vamos tratar os eventos dos controles usados no formulário.

Evento Click do botão Procurar:

 private void btnProcurar_Click(object sender, EventArgs e)
   {
      if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
        txtValorAtual.Text = folderBrowserDialog.SelectedPath;
    }

Evento Click do botão Atualizar:

  private void btnAtualizar_Click(object sender, EventArgs e)
    {
      int idx = lblEntradas.SelectedIndex;
      if (idx != -1)
           lblEntradas.Items[idx] = txtValorAtual.Text;
    }

Evento Click do botão Deletar:

private void btnDeletar_Click(object sender, EventArgs e)
    {
      int idx = lblEntradas.SelectedIndex;
      if (idx != -1)
      {
        lblEntradas.Items.RemoveAt(idx);
        idx--;
        if (idx < 0)
        {
          idx = 0;
        }
        lblEntradas.SelectedIndex = idx;
      }
    }

Evento Click do botão Incluir:

 private void btnIncluir_Click(object sender, EventArgs e)
    {
      if (!String.IsNullOrEmpty(txtValorAtual.Text))
        lblEntradas.Items.Add(txtValorAtual.Text);
    }

Evento Click do botão OK:

  private void btnOk_Click(object sender, EventArgs e)
    {
        DefineCaminhoVariavel();
        Close();
    }

Evento Click do botão Cancelar:

private void btnCancelar_Click(object sender, EventArgs e)
    {
      Close();
    }

Evento Click do botão Exportar:

private void btnExportar_Click(object sender, EventArgs e)
    {
      using(SaveFileDialog sfd = new SaveFileDialog())
      {
        sfd.Filter = "Arquivos Textos (*.txt)|*.txt";
        sfd.Title = "Salvar Variável de ambiente para o disco";
        sfd.FileName = "ValorCaminhoAntigo.txt";
        sfd.DefaultExt = ".txt";
         if (sfd.ShowDialog() == DialogResult.OK)
             File.WriteAllText(sfd.FileName, CriarCaminhoVariavel());
      }
    }

Evento MouseUp do Listbox:

 private void lbEntradas_MouseUp(object sender, MouseEventArgs e)
    {
         txtValorAtual.Text = lblEntradas.SelectedItem.ToString();
    }

Evento CheckedChanged do RadioButton Process:

private void radProcess_CheckedChanged(object sender, EventArgs e)
    {
        ObtemCaminhoVariavel();
    }

Executando o projeto iremos obter:

c_varamb12

Pegue o projeto completo aqui: PathEditor.zip

Source: IMasters

Categorizados em:

Este artigo foi escrito pormajor

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *