Domanda

Qualcuno può dirmi come cambiare directory usando FtpWebRequest? Sembra che dovrebbe essere una cosa facile da fare, ma non lo vedo.

Modifica

Voglio solo aggiungere ... Non ho il cuore impostato su FtpWebRequest. Se esiste un modo migliore (più semplice) per eseguire FTP in .NET, faccelo sapere.


Apparentemente non c'è modo di farlo usando una connessione live, è necessario cambiare l'uri per indurre ftpwebrequest a usare una richiesta diversa (grazie Jon).

Quindi sto cercando un client di terze parti ...

Alcune delle soluzioni open source che ho provato non hanno funzionato troppo bene (ho continuato a bloccarmi), ma ho trovato una soluzione open source che ha superato alcuni dei miei test preliminari (. NET FTP Client ).

È stato utile?

Soluzione

C'è un post sul blog di Mariya Atanasova che mostra come si può fingere - in pratica devi mettere la directory sull'URL.

Sospetto che potresti stare meglio con una libreria FTP dedicata, una che non cerca di forzare tutto nel modo di fare le cose sul WebRequest. Non ho usato personalmente librerie di terze parti per questo, ma una ricerca per "libreria FTP .NET" trova molti candidati.


Modifica: jcolebrand (in caso di possibilità di collegamento del blog nel 2006)

  

Molti clienti ci chiedono come possono utilizzare il comando CWD con il nostro FtpWebRequest.

     

La risposta è: non è possibile utilizzare direttamente il comando, ma è possibile modificare il parametro uri per ottenere lo stesso risultato.

     

Supponiamo che tu stia utilizzando il seguente formato:

String uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl";
FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(uri);
Request.Method = "LIST";
  

L'esempio sopra ti porta alla directory del tuo utente e vi elenca tutti i contenuti. Ora supponiamo che tu voglia andare indietro di 2 directory ed elencarne i contenuti (a condizione che il tuo utente disponga delle autorizzazioni per farlo). Chiudi il precedente FtpWebRequest e ne emetti uno nuovo con questo uri

uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/%2E%2E/%2E%2E";
  

Ciò equivale ad accedere con le credenziali dell'utente e quindi utilizzare cd ../../

     

Nota: se provi a usare & # 8221; .. & # 8221; direttamente senza sfuggirli, la classe uri li spoglia, quindi " ftp: // myFtpUserName: myFtpUserPassword @ myFtpUrl /../.." è equivalente a " ftp: // myFtpUserName: myFtpUserPassword @ myFtpUrl / "

     

Ora supponiamo che tu voglia andare nella directory di un altro utente che si trova ad un livello sopra la radice. Se non si specifica un nome utente e una password è equivalente all'accesso come utente anonimo. Quindi emetti un nuovo FtpWebRequest con il seguente uri

"ftp://myFtpUrl/%2F/anotherUserDir"
  

Ciò equivale ad accedere come anonimo e quindi a

Cd /
cd anotherUserDirectory

Altri suggerimenti

Devi chiudere la connessione corrente:

request.Close();

E aprine uno nuovo con un altro uri:

uri = "ftp://example.com/%2F/directory" //Go to a forward directory (cd directory)
uri = "ftp://example.com/%2E%2E" //Go to the previously directory (cd ../)

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);

Invece di utilizzare il metodo ListDirectory di FTPWebRequest è possibile utilizzare il metodo ListDirectoryDetails di FtpWebRequest.

Da questo puoi usare l'espressione regolare per ottenere il valore che desideri. Ecco fatto, funziona bene per me nel mio caso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top