Criando/Baixando/Listando/Apagando Arquivos no Delphi ASP.NET

Olá pessoal!

Hoje vou mostrar como criar arquivos .txt ou .sql com Delphi ASP.NET em tempo de execução a partir de uma string qualquer, gravar estes arquivos no servidor e descer para o usuário, também vou mostrar como listar os arquivos gerados, apagar e ler os dados de cada arquivo, recomendo a leitura do artigo Trabalhando com Diretórios e Arquivos do Blog Geeks .NET, lá o meu colega Mateus Chies já demonstrou algumas dessas funções da classe System.IO.

Bom, neste exemplo temos uma página que executa SQL diretamente no banco e exibe os resultados em uma gridView, após isso temos uma função que pega estes dados e gera um arquivo SQL com comandos para inserir (INSERT INTO ...) e disponibiliza o arquivo .SQL pra download, vamos primeiramente fazer a procedure que gera a SQL a partir de um dataset e grava o arquivo no servidor.


procedure TExemplo.GerarSQLInsert(ds:dataset);
var
  C,R: Integer;
  sql: StringBuilder;
  caminho, arquivo:string;
  arq: System.IO.FileInfo;
  dir: System.IO.Directory;
  stream: System.IO.StreamWriter;
begin
    {$REGION 'Cria SQL Insert'}
    sql := StringBuilder.Create;
    // Inicia transação na banco
    sql.appendLine('BEGIN TRANSACTION');
    sql.appendLine('GO');
    sql.AppendLine('');
    // Registros Encontrados
    for R := 0 to ds.Tables[0].Rows.Count - 1 do
    begin
      // Inicia comando Insert com Nome da Tabela
      sql.AppendLine('INSERT INTO '+txbNomeTabela.Text+' (');
      // Recupera Campos/Atributos
      for C := 0 to ds.Tables[0].Columns.Count - 1 do
      begin
        // Se não for última coluna precisa vírgula
        if C <> ds.Tables[0].Columns.Count -1 then
          sql.AppendLine(ds.Tables[0].Columns.Item[C].ColumnName+', ')
        else
          sql.AppendLine(ds.Tables[0].Columns.Item[C].ColumnName);
      end;
      // Fecha Atributos
      sql.AppendLine(') ');
      // Dado de cada Atributo
      sql.AppendLine('VALUES (');
      for C := 0 to ds.Tables[0].Columns.Count - 1 do
      begin
        // Se não for última coluna precisa vírgula
        if C <> ds.Tables[0].Columns.Count -1 then
        begin
          if ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM <> '' then
          begin
            // Verifica se o tipo é double
            if NumeroValido(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM) then
              sql.AppendLine(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+', ')
            else  // Se não deve ser string e precisa aspas
              sql.AppendLine(' '''+ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+''', ');
          end
          else
            sql.AppendLine('NULL, ');
        end
        else
        begin
          // Verifica se tem valor
          if ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM <> '' then
          begin
            // Verifica se o tipo é double
            if NumeroValido(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM) then
              sql.AppendLine(ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM)
            else  // Se não deve ser string e precisa aspas
              sql.AppendLine(' '''+ds.Tables[0].Rows.Item[r].Item[c].ToString().TRIM+''' ');
          end
          else
            sql.AppendLine('NULL');
        end;
      end;
      // Fecha Dados
      sql.AppendLine(')');
      sql.AppendLine('GO');
      sql.AppendLine('');
    end;
    sql.AppendLine('');
    // Encerra transação e grava registros
    sql.appendLine('COMMIT');
    sql.appendLine('GO');
    {$ENDREGION}
    // Exibe
//    lblScript.Text := sql.ToString;
    {$REGION 'Cria Arquivo SQL Insert e Desce para o Usuário'}
    try
      caminho := Server.MapPath('.')+'\SQL\';
      arquivo := 'SQL_INSERT_'+txbNomeTabela.Text+'.sql';
      // verifica / cria diretório se não existe
      if dir.Exists(caminho) = False then
        dir.CreateDirectory(caminho);
      // cria arquivo
      arq := System.IO.FileInfo.Create(caminho+arquivo);
      // Insere SQL no arquivo
      stream := System.IO.StreamWriter.Create(caminho+arquivo);
      stream.WriteLine(sql.ToString);
      stream.Close();
      // download do arquivo
      ScriptManager.RegisterStartupScript(Page, Page.GetType(), Guid.NewGuid().ToString(),'window.open("/SQL/'+arquivo+'","downsql","menubar=no,scrollbars=no,WIDTH=15,HEIGHT=15");', true);
    except on ex:exception do
      response.write('Erro durante criação do arquivo.
Detalhes: '+ex.message);
    end;
    {$ENDREGION}
end;

// Função que verifica se o número é válido (é um número ou não)

function TExemplo.NumeroValido(Numero: String): Boolean;
Var
  N: Double;
begin
  Result := False;
  try                
    N := Convert.ToDouble(Numero);
    Result := True;
  Except
    Result := False;
  end;
end;


Bom, no código acima ficou bem comentado o que cada parte faz, então vamos para o próximo passo, exibir os arquivos gerados em uma grid e também ter a opção de exibir o conteúdo dos arquivos em um textBox, excluir os arquivos ou fazer o download novamente.

Exibir os arquivos de um diretório é fácil como você já viu no post od Geeks .NET, mas aquele exemplo temos um problema, ele exibe o caminho completo do arquivo no servidor mas nós queremos ver apenas os nomes dos arquivos, então veja como ficou a procedure abaixo:


procedure TExemplo.ListarArquivos;
var
  caminho, na:string;
  lista: ArrayList;
  i: integer;
begin
  caminho := Server.MapPath('.');
  lista := ArrayList.Create;
  gvSQL.DataSource := System.IO.Directory.Getfiles(caminho+'\sql');
  gvSQL.databind();
  for I := 0 to gvSQL.rows.Count - 1 do
  begin
    na := gvSQL.Rows.item[i].cells[3].Text;
    // Substitui o caminho até o diretório dos arquivos por '' -> nada
    na := na.replace(caminho+'\sql\','');
    lista.add(na);
  end;
  gvSQL.DataSource := lista;
  gvSQL.databind();
end;


Ok, você pode notar que jogamos os nomes dos arquivos dos diretórios na coluna (Cells) 3 da grid, isto porque já temos as funções de ler, excluir e baixar nas três primeiras colunas da grid, veja o código da grid, tire os espaços nas tags.


< asp:gridview backcolor="White" bordercolor="#999999" borderstyle="Solid" borderwidth="1px" cellpadding="3" font-size="Small" forecolor="Black" gridlines="Vertical" id="gvSQL" runat="server">
    < columns>
   < asp:buttonfield commandname="LER" text="Carregar">< /asp:buttonfield>
            < asp:buttonfield commandname="DOWNLOAD" text="Download">< /asp:buttonfield>
            < asp:buttonfield commandname="EXCLUIR" imageurl="~/imagens/exc.gif" text="Excluir">< /asp:buttonfield>
          < /columns>
          < footerstyle backcolor="#CCCCCC">< /footerstyle>
          < pagerstyle backcolor="#999999" forecolor="Black" horizontalalign="Center">< /pagerstyle>
          < selectedrowstyle backcolor="#000099" font-bold="True" forecolor="White">< /selectedrowstyle>
          < headerstyle backcolor="Black" font-bold="True" forecolor="White">< /headerstyle>
          < alternatingrowstyle backcolor="#CCCCCC">< /alternatingrowstyle>
        < /asp:gridview>


Agora já sabemos criar os arquivos, exibir eles em uma grid, vamos a parte de ler e e excluir os arquvos existentes, para isso vamos implementar as funções para cada botão da grid, fazemos isto no evento RowCommand, veja código abaixo:


procedure TExemplo.gvSQL_RowCommand(sender: TObject; e: System.Web.UI.WebControls.GridViewCommandEventArgs);
var
  caminho,arquivo:string;
  arq: System.IO.FileInfo;
  reader: System.IO.StreamReader;
begin
  // Se o comando é EXCLUIR
  if e.commandname = 'EXCLUIR' then
  begin
    // Pega o caminho até o diretório
    caminho := Server.MapPath('.')+'\SQL\';
    // o Nome do arquivo SQL
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    // Cria arquivo
    arq := System.IO.FileInfo.Create(caminho+arquivo);
    // Se arquivo existe -> com certeza existe
    if arq.Exists then
      arq.Delete;  // Deleta
    // Atualiza Lista dos Arquivos
    ListarArquivos;
  end;
  // Se o comando é para baixar o arquivo -> DOWNLOAD
  if e.commandname = 'DOWNLOAD' then
  begin
    // Pega nome arquivo
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    // Redireciona usuário para endereço do arquivo, vai pedir pra baixar...
    Response.redirect('/SQL/'+arquivo);
  end;
  // Se for pra ler -> exibir na textbox conteúdo do arquivo
  if e.commandname = 'LER' then
  begin
    caminho := Server.MapPath('.')+'\SQL\';
    arquivo := GVSQL.Rows.Item[convert.ToInt32(e.commandargument)].Cells[3].Text;
    reader := StreamReader.Create(caminho+arquivo);
    // Lê arquivo até o fim e joga string para textbox
    txbSQL.text := reader.ReadToEnd;
    reader.Close();
  end;
end;


Bom pessoal, basicamente é isto ai, não mostrei como faz .txt né, é só trocar o final do nome do arquivo (Extensão) de .sql para .txt e pronto. Espero que seja útil, hoje também fiz um post no Geeks mostrando como exportar dados de uma grid para o Excel, pode ser muito útil em alguns casos, normalmente o usuário pede também...

Agradecimentos ao Tiago Pasieka que começou a página que me motivou fazer estas funções, valeuu!!

Até!

Witricity: Eletricidade sem fio

Em 2007 vi no Inovação Tecnológica uma matéria sobre eletricidade sem fio, achei muito legal mas desconfiei dos problemas que isso poderia gerar, hoje vi um vídeo demonstrando que não existe risco algum utilizar esta tecnologia, finalmente vamos nos livrar dos fios, eu espero! :D




Encontrei por aqui.

Como se tornar um Hacker

Olá pessoal, recebi a dica do Helton e resolvi compartilhar aqui uma leitura básica pra quem tem interesse em desenvolvimento de softwares, a tradução do manual dos hackers de Eric Steven Raymond. Lá você encontrará alguns conceitos muito importantes para seguir nessa nossa vida louca, veja alguns trechos.

--------------------------------------------------
Existe uma comunidade, uma cultura compartilhada, de programadores experts e magos de redes que traçam sua história desde décadas atrás nos primeiros mini-computadores de tempo compartilhado e nos mais remotos experimentos da ARPAnet. Os membros dessa comunidade originaram o termo 'hacker'. Hackers construiram a Internet. hackers criaram o sistema operacional Unix da forma como ele é hoje. Hackers rodam a Usenet. Hackers fizeram a World Wide Web funcionar. Se você é parte dessa cultura, se você contribuiu para isso e outras pessoas nisto o chamam de hacker, então você é um hacker.
--
Há um outro grupo de pessoas que ruidosamente se auto-entitulam hackers, mas não são. Essas são pessoas (em grande parte adolescentes do sexo masculino) que possuem uma atração por entrar em computadores a força e por burlar o sistema telefônico. Verdadeiros hackers chamam essas pessoas de 'crackers' e não têm nada a ver com eles. Hackers verdadeiros em grande parte pensam que crackers são preguiçosos, irresponsáveis e não tão brilhantes, e sustentam que ser capaz de quebrar segurança não faz de você um hacker mais do que ser capaz de fazer ligação direta em um carro faz de você um engenheiro automotivo. Infelizmente, muitos jornalistas e escritores têm usado enganosamente a palavra 'hacker' para descrever crackers; isso irrita profundamente os verdadeiros hackers.
--
A diferença básica é esta: hackers constroem coisas, crackers as quebram.

CSS não carrega com login ASP.NET

Olá pessoal, esta semana tive um pequeno problema durante o desenvolvimento de um sistema web no VS 2008 SP1 com dotNET 3.5, fiz uma master page com CSS e um diretório com imagens do modelo, criei um novo web form baseado na master page e configurei a web.config para somente permitir visualizar as páginas quem já fez login, conforme código abaixo, após isso as páginas somente carregavam os estilos após o usuário ter feito login.



Após muita pesquisa na Internet consegui resolver o problema adicionando permissão de acesso para todos os usuários nos diretórios das imagens e do CSS, veja código abaixo.



Meu arquivo Web.config completo.



A estrutura dos diretórios e páginas do meu Web Site.


Se alguém passou por uma situacão parecida e encontrou uma outra solução gostaria que postasse nos comentários, abaixo estou anexando o livro onde encontrei esta dica.
Apontamentos ASP Net
Até.

Diferenças no Pensamento entre Ricos, Classe Média e Pobres

Olá a todos!!

Comecei a ler esta semana o livro "Independência Financeira. O Guia do Pai Rico", e achei logo no início uma coisa muito interessante, a diferença no pensamento entre ricos e pobres, acho que vale a pena compartilhar aqui para refletirmos e começarmos a pensarmos como ricos, ou não.


P/CM – Diz: “Nunca vou ficar rico”.
R – Diz: “Sou um homem rico”. E mesmo se estiver quebrado, pois diz: ‘Há uma diferença entre ser pobre e estar quebrado. Estar quebrado é algo temporário; ser pobre é eterno”.
P/CM – Não ligo para dinheiro, ou O dinheiro não é importante. 


R – O dinheiro é poder.
P/CM – Trabalha por dinheiro.
R – O dinheiro trabalha para mim.

P/CM – Adquirem obrigações pensando que são ativos.
R – Adquirem ativos.

P/CM – Compram primeiro artigos de luxo (casas grandes, carros maiores, diamantes, peles, jóias ou barcos).
R – Compram os artigos de luxo por último.

P/CM – O amor ao dinheiro é a raiz de todo mal.
R – A falta de dinheiro é a raiz de todo mal.

P/CM – Não dá para comprar isso.
R – O que posso fazer para comprar isso?
R – Meu cérebro fica mais forte a cada dia porque eu o exercito. Quanto mais forte fica, mais dinheiro ganho.

P/CM – Tem o hábito de colocar o cérebro para dormir quando o assunto é dinheiro. Evita o assunto.
R – Tem o costume de exercitar seu cérebro quando o assunto é dinheiro.

P/CM – Que os ricos deviam pagar mais impostos para atender os menos afortunados.
R –Que os impostos punem os que produzem e recompensam os que não produzem.

P/CM – Estude arduamente, forme-se, para poder arrumar emprego numa boa empresa.
R – Estude arduamente, forme-se, para ficar rico, para entender como funciona o dinheiro e para aprender a faze-lo trabalhar para você, para ser independente financeiramente.

P/CM – Não sou rico porque tenho filhos.
R – Tenho que ser rico por causa de vocês, meus filhos.

P/CM – Proíbe que se fale de negócios durante as refeições.
R – Inventiva as conversas sobre dinheiro e negócios na hora do jantar.

P/CM – Em questões de dinheiro seja cuidadoso, não se arrisque.
R – Aprenda a administrar o risco. Conhecendo a operação, o risco diminui.

P/CM – Nossa casa é nosso maior investimento e nosso maior patrimônio.
R – Minha casa é uma dívida e se sua casa for seu maior investimento, você terá problemas.

P/CM – Paga suas contas no prazo, em primeiro lugar.
R - Paga suas contas no prazo, deixando para a última hora. Primeiro paga a si mesmo.

P/CM – Acredita que a empresa ou o governo deveria cuidar de você e de suas necessidades.
R – Acredita na auto-suficiência financeira, se manifestando contra a mentalidade ‘dos direitos’ e fala que isso cria pessoas fracas e financeiramente necessitadas.

P/CM – Luta para poupar uns poucos reais.
R – Cria investimentos.

P/CM – Ensina a escrever um currículo impressionante para encontrar um bom emprego.
R – Ensina a fazer sólidos planos financeiros e de negócios de modo que possa criar empregos.