C# - Trabalhando com variáveis de ambiente

 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 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 o qual inclui as seguintes variáveis de ambiente:

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 é armazenados 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:

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;

Informe o nome PathEditor e clique no botão OK;

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

Disponha os controles conforme o leiaute da figura abaixo:

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

   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.

1- Evento Click do botão Procurar

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

1- 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;
    }

1- 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;
      }
    }

1- Evento Click do botão Incluir

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

1- Evento Click do botão OK

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

1- Evento Click do botão Cancelar

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

1- 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());
      }
    }

1- Evento MouseUp do Listbox

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

1- Evento CheckedChanged do RadioButton Process:

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

Executando o projeto iremos obter:

Pegue o projeto completo aqui:  PathEditor.zip

"Aquele que diz: Eu conheço-o (a Jesus), e não guarda os seus mandamentos, é mentiroso, e nele não está a verdade."
1 João 2:4

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti