C :: Aufgabe #136 :: Lösung #1

3 Lösungen Lösungen öffentlich
#136

Regelmäßiges Runterladen und Abspeichern von Dateien

Anfänger - C von ZRX88 - 04.12.2016 um 12:06 Uhr
Eine Firma X stellt euch einen FTP Zugang (ggf. mit Zugang + PW ) zur Verfügung, wo sie jeden Tag eine Datei xyz.txt updaten und mit den aktuellsten Datensätzen befüllen.

Im ersten Schritt sollen diese Dateien heruntergeladen werden und dann auch in einem Ordner auf der Festplatte abgelegt werden.
Zum Wiedererkennen soll sowohl die Quelle als auch der Zeitpunkt des Downloads abgespeichert werden:
mögliche Beispiele:
* Zielorder > File 'FTP_x_xzy_2016_12_24.txt'
* Zielorder > Ordername '2016-12-24' > File 'xyz.txt'

Wichtig: Die Ablage muss sauber strukturiert sein.

Anmerkung: Da ich euch keinen FTP zur Verfügung stelle und wenn ihr keinen eigenen zum Testen habt:
Stattdessen ladet doch einfach den Inhalt von https://trainyourprogrammer.de/python herunter.

Optional:
* Erweitert das Programm so, dass es alle Dateien auf dem FTP herunterlädt.
* Alternativ: Speichert den Inhalt von alle verfügbaren Python Aufgaben Seiten herunter?


#1
vote_ok
von devnull (8870 Punkte) - 05.12.2016 um 16:34 Uhr
Sourcen der verwendeten FTP-Bibliothek sind hier zu finden: FTPlib.
Getestet wurde Anonymous FTP mit proftpd unter Ubuntu 14.04 LTS.

Quellcode ausblenden C-Code
/****************************************
 * ftpdown.c 	FTP Download
 * compile:gcc -Wall -o ftpdown ftpdown.c -lftp
 ****************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ftplib.h>

#define REMOTE_HOST "localhost"
#define REMOTE_USER "anonymous"
#define REMOTE_PW   "anonymous"
#define REMOTE_FILE "xyz.txt"

enum { ERROR_CONNECT, ERROR_LOGIN, ERROR_GET };


void ftp_error(int rtype, int rcode) {
	fprintf(stderr, "%s\n", "***FTP Error:");
	switch (rtype) {
	case ERROR_CONNECT:
		fprintf(stderr, "%s", "no connection.");
		break;
	case ERROR_LOGIN:	
		fprintf(stderr, "%s", "login not permitted.");
		break;
	case ERROR_GET:	
		fprintf(stderr, "%s", "cannot get the remote file.");
		break;
	default:
		fprintf(stderr, "%s", "unknown error.");
	}
	fprintf(stderr, " (error code = %d)\n", rcode);
}
			
char *get_local_path(const char *filename) {
	static char local_path[256];
	char tmbuf[16];
	time_t t;
		
	strcpy(local_path, getenv("HOME"));
	strcat(local_path, "/Downloads/FTP_xyz_");
	t = time(NULL);
	strftime(tmbuf, 16, "%Y_%m_%d.txt", localtime(&t));
	strcat(local_path, tmbuf);
	return local_path;
}
 
int main(void) {
	netbuf *nctrl;
	char stbuf[64];
    size_t fsize;
    int ftprc;

	FtpInit();

	if ((ftprc = FtpConnect(REMOTE_HOST, &nctrl)) == 0) {
		ftp_error(ERROR_CONNECT, ftprc);
		exit(EXIT_FAILURE);
	}

	if ((ftprc = FtpSysType(stbuf, 64, nctrl)) == 1)
		printf("System type of remote host is %s\n", stbuf);

	if ((ftprc = FtpLogin(REMOTE_USER, REMOTE_PW, nctrl)) == 0) {
		ftp_error(ERROR_LOGIN, ftprc);
		FtpQuit(nctrl);
		exit(EXIT_FAILURE);
	}

	if ((ftprc = FtpSize(REMOTE_FILE, (int *)&fsize, FTPLIB_ASCII, nctrl)) == 1)
		printf("Size of remote file '%s' is %zd.\n", REMOTE_FILE, fsize);
	
	if ((ftprc = FtpGet(get_local_path(REMOTE_FILE), REMOTE_FILE, 
				FTPLIB_ASCII, nctrl)) == 0)
		ftp_error(ERROR_GET, ftprc);
	else
		printf("Remote file '%s' loaded as '%s'.\n", REMOTE_FILE, 
				get_local_path(REMOTE_FILE));
			
	FtpQuit(nctrl);
	return 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben