(C#) FTP mappák és tartalmainak beolvasása

(C#) FTP mappák és tartalmainak beolvasása
2013-02-12T16:01:24+01:00
2013-02-14T14:54:05+01:00
2022-11-28T06:45:38+01:00
Gülredy
Elég kezdetleges tudásom van C#-ból, így kissé nehézkes számomra ez a feladat, ezért fordulok hozzátok.

Szóval eljutottam odáig, hogy egy FTP szerveren egy adott mappából (ami egy hónap számban megadva), beolvassa az abban lévő mappákat. (ezek lennének a napok)
A napok mappát azért olvastatom be külön egy list-be mert nem biztos hogy minden egyes nap mappája létezni fog.

Szóval, megvannak a "nap mappák".

Ezután azt szeretném, hogy egy ciklussal végigmenni a beolvasott napok mappáin, úgy ,hogy azoknak a tartalmát olvasom is be.

Tehát kellene egy foreach ami végigmegy a "mappalista" list-en, és azon belül még egy foreach ami az aktuális mappában lévő fájlokon megy végig (ez ez azért kell mert csak .csv fájlokat olvasok be)

Na ezt a két foreach-et nem tudom miként kellene megírni, erre kérnék segítséget.

Tehát itt a kódom amivel dolgozom:
int month = System.DateTime.Now.Month; this.allapotTxb.Text = "Csatlakozás a kiszolgálóhoz...\r\n"; string remoteDir = "ftp://xxx.xxx.xxx.xxx/2013/" + month; FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(remoteDir)); request.Credentials = new NetworkCredential("user", "password"); request.Method = WebRequestMethods.Ftp.ListDirectory; StreamReader sr; try { sr = new StreamReader(request.GetResponse().GetResponseStream()); } catch (WebException) { this.allapotTxb.Text += "Erre a napra még nincs feltöltve jelenléti ív, vagy a szerver nem érhető el."; return; } this.allapotTxb.Text += "Csatlakozva.\r\n"; List<String> mappalista = new List<String>(); List<String> csv = new List<String>(); string str = ""; while ((str = sr.ReadLine()) != null) { mappalista.Add(str.Substring(2, str.Length - 2)); } mappalista.Sort(); sr.Close(); str = ""; /*Itt szeretném végrehajtani azt amiről írtam*/ foreach (string mappa in mappalista) { foreach (string s in mappa) { if (s.ToUpper().Contains(".CSV")) { csv.Add(s); } } }
Mutasd a teljes hozzászólást!

  • Én a foreach-ről a Hatékony C# című könyvben úgy olvastam, hogy az végigmegy a több dimenziós adatstruktúrákon is. Tehát ha neked pl van egy mátrixod, ami stringeket tárol, akkor azon 1 foreach végig megy ellentétben 1 for ciklussal:

    For Ciklussal:

    for (int i=0;i<n;i++) { for(int j=0;j<m;j++) { //matrix[i,j]. elemének feldolgozása } }

    Foreach-csel:

    foreach(string element in matrix) { //element feldolgozása }

    Ha jól emlékszem az ott leírtakra, akkor még akár nem négyzetes "mátrix"-ot is képes gond nélkül bejárni. Ha pl. az egyes sorok nem azonos elemszámúak.
    Mutasd a teljes hozzászólást!
  • Szvsz ez így FTP szerveren alapból nem fog működni (lehet tévedek), hogy rekurzívan bejárjad a mappákat, mintha a helyi gépeden csinálnád.
    Mutasd a teljes hozzászólást!
  • Itt van talán egy működő megoldás (Dave_Anderson részéről):
    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/7..

    a gond vele annyi, hogy az egyes ftp szervereken elérőek lehetnek a szerver válaszai, így tehát a formátum is, amit visszaad.

    Emiatt a programban található parsolások, string műveletek valszeg nem lesznek jók, azt neked kell kihámozni és átírni (Remove, Substring, DateTime.Parse).
    Mutasd a teljes hozzászólást!
  • Már megoldottam a feladatot. Ezt a linket amit belinkeltél már én is láttam de nem igazán tudtam kihámozni belőle nekem valót.
    Azért köszönöm szépen a segítséget!
    Mutasd a teljes hozzászólást!
  • Már megoldottam a feladatot.

    Bocsi, de elárulnád, hogy miként?
    Segíthetnél véle a később errejáróknak/olvasóknak/kutakodóknak.
    Mutasd a teljes hozzászólást!
  • "Én a foreach-ről a Hatékony C# című könyvben úgy olvastam, hogy az végigmegy a több dimenziós adatstruktúrákon is."


    Ha tudod mit is csinál a foreach, akkor már meg is érted.

    Akkor megy végig a szerkezeten (pl rekurzívan), ha "akar"

    1./ Nézz utána mely interface megvalósításától függ az, hogy egy tároló szerepelhet-e foreach-ben.
    2./ Nézd meg mit is csinál ez az interface függvény.

    Na innen az a kérdés, hogy aki implementálja a függvényt, az pontosan milyen kódot tett bele
    Mutasd a teljes hozzászólást!
  • Nem másolom be az egész kódot csak az ide tartozó részt:

    foreach (string mappa in mappalista) { remoteDir = remoteDir + "/" + mappa; request = (FtpWebRequest)FtpWebRequest.Create(new Uri(remoteDir)); request.KeepAlive = false; request.Credentials = new NetworkCredential(this.user,this.pwd); request.Method = WebRequestMethods.Ftp.ListDirectory; sr = new StreamReader(request.GetResponse().GetResponseStream()); List<string> fajlok = new List<string>(); int kezdet,veg; while ((str = sr.ReadLine()) != null) { if (str != mappa + "/." && str != mappa + "/.." && str.ToUpper().Contains(".CSV") && str.ToUpper().Contains(this.label1.Text)) { kezdet = str.IndexOf("/")+1; veg = str.Length; fajlok.Add(str.Substring(kezdet,veg-kezdet)); } } str = ""; sr.Close(); ..... }

    Tehát ez előtt a foreach előtt van a kód amit a témanyitó hozzászólásomba raktam, ez a rész pedig a foreach-ek helye.

    Az első hsz-emben lévő kódban csatlakozik az ftp-hez beolvassa az adott hónap mappáit, majd berakja egy list-be.
    Ezután a foreach-el ezen a list-en megyek végig úgy, hogy minden egyes mappához külön csatlakozik és beolvassa a tartalmát (ha az megfelel a az adott feltételnek lásd: IF)

    Az if- után pedig hozzáadom a fájlok listához, amit majd letöltök, és beolvasom datagridview-ba.

    Biztos van ettől sokkal egyszerűbb megoldás is, sőt...
    De működik, és emberi mértékkel nem is lassú! (mivel nincs is sok fájl)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd