Laden...

FTP Listing aller Dateien eines Dateityps (rekursiv)

Erstellt von cyntonix vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.803 Views
C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 12 Jahren
FTP Listing aller Dateien eines Dateityps (rekursiv)

Hallo zusammen,

ich bräuchte kurz eure Meinung 😃

Wir müssen auf unserem FTP-Server öfters einen Prüflauf ausführen welche bzw. ob Dateien vorhanden sind.
Ich prüfe zuerst ob die gesuchte Datei vorhanden ist:


        public bool FTPFileExists(string FilePath)
        {
            FtpWebRequest req = (FtpWebRequest)WebRequest.Create(sFtpUrl + FilePath);
            req.Credentials = new NetworkCredential(sFtpUser, sFtpPassword);
            req.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            try
            {
                FtpWebResponse resp = (FtpWebResponse)req.GetResponse();
                resp.Close();
                return true; // File exist
            }
            catch
            {
                return false; // File doesn’t exist
            }
        }

... aber das dauert je nach Tagesform unserer Internetleitung eine weile.
(Ich habe keine Möglichkeit gefunden nicht jedesmal für eine Datei einen neuen Request zu machen. Vorschläge wie ich dies beschleunigen kann?)

Nun möchte ich generell vor dem Start der Überprüfung ein Filelisting erstellen welche alle Dateien in einem Ordner (Unterordner einbezogen) erstellt.

Mir ist die Listingfunktion bekannt, habe aber Angst dass ich hier an perfomance nicht viel gewinne.
Eine fertige Funktion / Methode habe ich leider nicht gefunden um dies zu testen. Das zu programmieren bekomme ich schon hin.

Nun zu meiner konkreten Frage:
Da auf dem Server auch PHP läuft könnte ich dies auch als PHP-Script machen und beim Aufruf der php-Datei ein Listing Ausgeben. Leider bin ich hier nicht so fit.
**- soll ich dies in php realisieren und in meiner c#-anwendung einlesen?

  • soll ich ein listing per c# holen und danach prüfen**

Es kann sein dass paar mal im Jahr eine Überprüfung mit 5000 Dateien stattfindet. Macht das was aus wenn ich 5000x auf den FTP per request "einprügle"? Nicht das dieser meint ich mach ne "attacke" 😃

Vielen Dank für eure Meinung

Gruß
cyn

G
538 Beiträge seit 2008
vor 12 Jahren

Ich würde (ähnlich wie es Filezilla tut) den Inhalt der Betroffenen verzeichnisse abfragen (das müssen ja vielleicht nicht alle sein) und die dadurch entstandene Liste verwenden.

Die Idee mit PHP funktioniert natürlich auch, du könntest dir also eine csv oder xml Datei erzeugen oder komplett die Auswertung in PHP machen.

Ich vermute, dass PHP hier perfomanter arbeitet als FTP (alleine weil das "exklusiv lokal aufm Server" läuft). Zumindest kannst du mit dem RecursiveDirectoryIterator über alle Verzeichnisse laufen und die Dateiliste erzeugen.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

C
cyntonix Themenstarter:in
37 Beiträge seit 2009
vor 12 Jahren

Ich habe jetzt einfach mal die PHP-Variante getestet da es wahrscheinlicher ist dass diese performanter ist...
gebe die Pfade direkt aus und hole mir den Inhalt in C#

function getDirectory( $path = '.', $level = 0 ){ 

    $ignore = array( 'cgi-bin', '.', '..' ); 
    // Directories to ignore when listing output. Many hosts 
    // will deny PHP access to the cgi-bin. 

    $dh = @opendir( $path ); 
    // Open the directory to the handle $dh 
     
    while( false !== ( $file = readdir( $dh ) ) ){ 
    // Loop through the directory 
     
        if( !in_array( $file, $ignore ) ){ 
        // Check that this file is not to be ignored 
             
            $spaces = str_repeat( ' ', ( $level * 4 ) ); 
            // Just to add spacing to the list, to better 
            // show the directory tree. 
             
            if( is_dir( "$path/$file" ) ){ 
            // Its a directory, so we need to keep reading down... 
             
                // echo "<strong>$spaces $file</strong><br />"; 
                getDirectory( "$path/$file", ($level+1) ); 
                // Re-call this same function but on a new directory. 
                // this is what makes function recursive. 
             
            } else { 
 
				$link = str_replace("./files/","http://www.xxx.de/files/",$path);
				$link = "$link/$file";
				
				
				
                echo "$link<br/>"; 
                // Just print out the filename 
             
            } 
         
        } 
     
    } 
     
    closedir( $dh ); 
    // Close the directory handle 

} 

Wie gesagt bin ich in php garnicht fit ... habe bestehende lösung angepasst.
Für Anregungen bzgl. php-code bin ich sehr offen!

DANKE

Gruß
cyn

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Ich habe jetzt einfach mal die PHP-Variante getestet da es wahrscheinlicher ist dass diese performanter ist...

Das ist nicht nur wahrscheinlich, darauf kannst Du dich sowas von verlassen 😉
Das FTP-Protokoll gibt da nicht sehr viel her, und man muss viele einzelne Anfragen übers Netz stellen. Die PHP-Variante kommt mit einer Einzigen aus. Da Du diese Möglichkeit hast, solltest Du sie IMO auf jeden Fall nutzen.

Fragen zum PHP-Code wären wohl in einem PHP-Forum besser aufgehoben - er sieht aber prinzipiell nicht schlecht aus.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca