PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfen ob Datei vorhanden ist mit Cpp


ravage
2004-04-07, 10:30:04
Moin

Ich möchte Prüfen ob ein Bild im Internet Vorhanden ist. Ist das mit C++ überhaupt möglich?

Zumindest sagt mir diese Funktion

#include <fstream>

int file_exist(const char *test)
{
ifstream testFile;
testFile.open(test);
if (testFile)
{
testFile.close();
return 1;
}
return 0;
}
und auch diese

#include <sys/stat.h>

int file_exist(const char *test)
{
struct _stat buf;
return _stat(test, &buf) == 0;
}

dass es die Datei nicht gibt. Aber ich weiss ja dass es sie gibt. :kratz2:

Anmerkung: In der Variable test steht der Pfad ;)

/EDIT: Bei lokalen Dateien funktionieren beide Funktionen

Xmas
2004-04-07, 12:47:48
Im Internet? Du meinst du übergibst die URL einer Datei an die Funktionen? Das kann auch nicht funktionieren. Da du von Bild redest, nehme ich mal an es dreht sich um HTTP. Dann kannst du es mit Sockets und einem HTTP Get versuchen. Erhälst du einen Fehler als Antwort (z.B. 404) ist das Bild nicht vorhanden.

ravage
2004-04-07, 13:30:11
Hast du zufällig eine Beispielfunktion parat, der ich eine url übergeben kann, und die mir dann sagt, ob das Ziel erreichbar ist oder nicht?

Oder kannst du mir sagen, wo ich sowas nachlesen kann?

Danke schon mal

/EDIT: Ich hab grad mal etwas gegoogelt, und Socket Programming ist ja ganz schön kompliziert für jemanden, der sich noch garnicht damit befasst hat ;)

Crushinator
2004-04-07, 14:06:45
Das hier (http://www.adp-gmbh.ch/win/misc/sockets.html) könnte für Socket-Anfänger hilfreich sein.

#include "Socket.h"
#include <iostream>

using namespace std;

int main() {

try {
SocketClient s("www.google.com", 80);

s.SendLine("GET / HTTP/1.0");
s.SendLine("Host: www.google.com");
s.SendLine("");

while (1) {
string l = s.ReceiveLine();
if (l.empty()) break;
cout << l;
cout.flush();
}

}
catch (const char* s) {
cerr << s << endl;
}
catch (String s) {
cerr << s << endl;
}
catch (...) {
cerr << "unhandled exception\n";
}

return 0;
}

Man müßte theoretisch nur die 404 Meldungen aus der Antwort von SocketClient::ReceiveLine() parsen. Wenn die URL gar nicht erreichbar ist, bekommt man's über die Exception mit.

Schau' doch mal, ob Du was damit anfangen kannst.

Trap
2004-04-07, 14:19:32
Internet gehört nicht zum C++-Standard. Es gibt aber fertige Bibliotheken oder z.B. unter Windows fertige Funktionalität im Betriebssystem: http://www.catalyst.com/support/help/cstools3/library/http/

ravage
2004-04-08, 11:25:38
Garstiges C++

Ich habs jetzt mit PHP gemacht (gelernt ist gelernt :naughty: )


function exist ($tmp)
{
$testdat = fopen($tmp,"r");
if($testdat)
{
fclose($testdat);
return 1;
}
return 0;
}

Eigentlich nicht viel anders, aber es funktioniert.

Jetzt habe ich nur das Problem, dass ich nach längerer Laufzeit einen Timeout vom Server bekomme auf dem ich das laufen lasse.

"Fatal error: Maximum execution time of 30 seconds exceeded in c:\html\test.php on line 4"

Da das mein Server ist, könnte ich den Wert wohl einfach höher setzen... oder gibt es eine Möglichkeit, bei einem länger laufendem PHP Script diesen Timeout zu überlisten?

In meinem Script werden in einer Schleife viele Bilder abgefragt, ob sie da sind (xyz1.jpg, xyz2.jpg, xyz3.jpg, ... ). Wenn er ein Bild nicht findet geht er zu den nächsten (zyx1.jpg, zyx2.jpg, ... ).

Kann ich da in der Schleife etwas einbauen, dass den Timer wieder auf 0 setzt?

/EDIT:

Hier mal der komplette Code


<?
function exist ($tmp)
{
$testdat = fopen($tmp,"r");
if($testdat)
{
fclose($testdat);
return 1;
}
return 0;
}
$datei = fopen("test.htm","w");
fwrite($datei, "<html><head><title>Test</title></head><body><center>Test</center><br><br>");
fclose($datei);

for($n=1;$n<=10;$n++)
{
$datei = fopen("test.htm","a");
fwrite($datei, $n.". ");
fclose($datei);

for($a=1;$a<=100;$a++)
{
echo($n."-".$a."\n");
$tmp="http://-Pfad zu den Bildern-/".$n."-".$a.".jpg";
if (exist($tmp) == "0")
{
break;
}
$tmp="<a href=\"".$tmp."\">".$n."-".$a."</a> ";

$datei = fopen("test.htm","a");
fwrite($datei, $tmp);
fclose($datei);
}
$datei = fopen("test.htm","a");
fwrite($datei, "<br><br>");
fclose($datei);
}
$datei = fopen("test.htm","a");
fwrite($datei, "</body></html>");
fclose($datei);
?>

Der Pfad zu den Bildern ist geheim *G* Die Bilder haben Dateinamen wie:

1-1.jpg
1-2.jpg
... ;)

/EDIT2:

Das soll irgendwann eine Bildergalereie werden. Wobei die erste zahl im Dateinamen eine Bildergruppe darstellt (1 = Silvester 2003, 2 = Ostern 2004 etc) und die zweite Zahl halt die Nummer des Bildes.

So kann man einfach alle Bilder in einen Ordner (durch ausbauen des Scriptes auch eigene Ordner für jede Gruppe) packen, das Script laufen lassen, und fertig ist die Bildergalerie.

Am aussehen kann man ja auch noch was ändern. Bis jetzt ist es ja nur eine billige Aufzählung ;)

Fragt mich aber nicht, warum ich das erst mit C++ machen wollte. Eigentlich deshalb, weil ich ein Projekt gesucht habe um C++ mal wieder etwas zu vertiefen.

ravage
2004-04-08, 12:45:17
Sry4doppelpost, aber langsam wirds unübersichtlich.

Mit

ini_set('max_execution_time', '0');

kann man den Timer abstellen. Ich hoffe, ich muss euch jetzt nicht mehr stören :)

Danke nochmal an alle helfenden