Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Tesla

Visual C# + ftp.exe

Mensagens Recomendadas

Tesla

Olá pessoal.

Escrevi um programa para me ajudar na passagem de ficheiros de um lado para outro.

Peguei no visual studio e usando uma rede interna de dois computadores (client-server) montei a aplicação e ela faz o que se pretende. Basicamente o utilizador diz qual o server FTP a que quer ligar, coloca as credenciais de acesso ao servidor, diz qual a pasta de onde quer fazer o upload e depois escolhe se quer o ficheiro mais novo ou mais velho. Tem também um funcionalidade de zipagem do ficheiro, usando o trabalho do Igor Pavlov (www.7-zip.org). O envio do ficheiro é feito através do velhinho ftp.exe. O programa basicamente é um timer que depois despoleta uma série de outros programas com o objectivo de satisfazer o utilizador.

Bom, então acabo de programar e vou testar no meu sistema de teste. Windows 7 + Ubuntu server LTS com vsftpd instalado. E tudo corre bem. O programa à hora marcada transfere o ficheiro marcado e depois coloca-se em estado de espera até ao próximo disparo. Porreiro pensei eu. Até que decidi colocar o programa a correr numa máquina importante para mim. O programa não destroi ficheiros. O que acontece é que o ftp.exe faz tudo menos enviar os dados. Ou seja, regista-se no servidor de ftp, altera para binário, insere o comando hash muda para a directoria de origem, faz o mput do ficheiro mas depois... tenho um código 200 e um 150 (OK to send data) e nada... não manda o ficheiro.

Se fizer tudo à manápula, já manda (o que põe logo de lado definições de firewall).

Estou à nora. Basicamente se invocar o ftp.exe dentro da minha aplicação ele não funciona (apenas na máquina importante win2k8 R2). Se correr o ftp.exe de forma manual tudo corre bem.

Preciso de ajuda. Nem sei se isto deveria ir para um forum de windows, pois até me parece que tem pouco que ver com C#... mas quem sabe vocês aqui já não deram de caras com um problema destes.

Obrigado pelo input.

P#$C$


Assinatura editada pelo staff, por favor consulte as regras.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

    Boa noite,

    Usares o ftp.exe a ser invocado pela aplicação não faz grande sentido. Sinceramente acho que devias ter na aplicação um cliente de ftp teu, e isso certamente resolvia o problema.

    Já experimentas-te fazer o cliente ftp na aplicação? Podes usar o componente chilkat que é bem porreiro e até suporta FTP sobre SSL.

Chilkat.Ftp2 ftp = new Chilkat.Ftp2();

ftp.Hostname = "ftp.teuservidor.interno";
ftp.Username = "tuapass";
ftp.Password = "tuapass";

//  Ligação ao servidor FTP e envio de login
success = ftp.Connect(); 
if (success != true) {
    MessageBox.Show(ftp.LastErrorText);
    return;
}

//  muda de directoria no servidor
success = ftp.ChangeRemoteDir("directoria_de_destino");
if (success != true) {
    MessageBox.Show(ftp.LastErrorText);
    return;
}

//  Upload de um ficheiro
string ficheirolocal;
ficheirolocal = "lixo.txt"; //nome do ficheiro local
string ficheiroRemoto;
ficheiroRemoto = "lixo.txt"; //nome do ficheiro remoto

success = ftp.PutFile(ficheirolocal,ficheiroRemoto); //envia o ficheiro
if (success != true) {
    MessageBox.Show(ftp.LastErrorText);
    return;
}

ftp.Disconnect(); //fecha a ligação

MessageBox.Show("Ficheiro com sucesso");

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tesla

Chilkat é pago.

Pois, é por esta razão que estou a usar componentes do windows.

O estranho é que no meu portatil (máquina de teste) tudo funciona como deve ser. Na máquina onde quero que esta aplicação corra é que não. Executo-a como administrador e na conta de administrador. Muito estranho...


Assinatura editada pelo staff, por favor consulte as regras.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

      Boa noite,

      Podes sempre fazer directo no teu código apenas com a framework .net usando a namespace system.net . Aqui fica o link para a documentação oficial.

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

    O facto de não te funcionar com o ftp.exe pode ter a ver com versões do Windows, e o próprio ftp.exe do Windows já é bem antigo e não existem certezas se vai continuar a ser distribuído com o Windows.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tesla

      Boa noite,

      Podes sempre fazer directo no teu código apenas com a framework .net usando a namespace system.net . Aqui fica o link para a documentação oficial.

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx

    O facto de não te funcionar com o ftp.exe pode ter a ver com versões do Windows, e o próprio ftp.exe do Windows já é bem antigo e não existem certezas se vai continuar a ser distribuído com o Windows.

Cordiais cumprimentos,

Apocsantos

Ora nem mais.

Vinha agora mesmo postar que já tinha encontrado a solução e que está tudo a funcionar como deve ser.

Obrigado pela ajuda pessoal!

Forte abraço.

Edit: para que sirva de referencia futura aqui vai o código que estou a usar

System.Net.FtpWebRequest up_ftp = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + textBox1.Text + ":" + textBox2.Text + @"/" + ult_fich));
                up_ftp.Credentials = new NetworkCredential(textBox3.Text, textBox4.Text);
                up_ftp.UseBinary = true;
                up_ftp.UsePassive = false;
                up_ftp.Method = WebRequestMethods.Ftp.UploadFile;
                FileStream fs = File.OpenRead(textBox5.Text + "\\" + ult_fich);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                fs.Close();
                Stream ftpstream = up_ftp.GetRequestStream();
                ftpstream.Write(buffer, 0, buffer.Length);
                ftpstream.Close();


Assinatura editada pelo staff, por favor consulte as regras.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.