Datei wird nicht gefunden - Bug bei Readfile/Openfile?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Rocys

Betreff: Datei wird nicht gefunden - Bug bei Readfile/Openfile?

BeitragDo, Nov 12, 2015 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen.
Ich habe ein Problem, das mich zum verzweifeln bringt. Würde mich über Hilfe sehr freuen!

Mein Programm soll eine große Menge an Dateien (ca. 2.500) aus dem Internet laden (funktioniert mit Hilfe von CURL sehr gut). Diese Dateien sollen dann geöffnet (per Code: [AUSKLAPPEN]
Readfile
) und analysiert werden.

Das funktioniert eigentlich sehr gut. Sobald aber eine bestimmte Anzahl an Dateien analysiert wurde, werden plötzlich keine Streams mehr geöffnet (Rückgabewert Code: [AUSKLAPPEN]
Readfile
ist 0). Die Überprüfung mit Code: [AUSKLAPPEN]
Filetype
gibt aber 1 zurück.

Die Streams werden definitiv geschlossen. Um sicherzugehen habe ich auch vor dem Öffnen eines neuen Streams einen Code zur Überprüfung eingebaut:

Code: [AUSKLAPPEN]

If ProfilStream><0 Then
   CloseFile ProfilStream
   ProfilStream=0
End If
            
ProfilStream=ReadFile("temp\"+DatumAktuell+"\profil_"+name+"_profil.txt")
            
If ProfilStream=0 Then RuntimeError ("Profil nicht gefunden: "+name)+Chr$(13)+"temp\"+DatumAktuell+"\profil_"+name+"_profil.txt"+Chr$(13)+FileType("temp\"+DatumAktuell+"\profil_"+name+"_profil.txt")


Code: [AUSKLAPPEN]
DatumAktuell
ist eine globale Variable, die vorher gesetzt wird. Code: [AUSKLAPPEN]
Name
wird jeweils aus einer anderen Datei ausgelesen. Dabei passiert der Fehler definitiv nicht - die Namen sind richtig und Code: [AUSKLAPPEN]
Filetype
gibt immer 1 zurück.

Mit Code: [AUSKLAPPEN]
OpenFile
passiert das Gleiche. Wenn ich die Datei, die nicht geöffnet wird, manuell ausklammere, taucht der Fehler bei der nächsten Datei ebenso auf.

Ich habe keine Ahnung, was hier los sein könnte. Hat jemand Ideen?

Mathias-Kwiatkowski

BeitragDo, Nov 12, 2015 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
gibt es den den ordner "DatumAktuell" ? wenn nicht muss der vorher über CreateDir erstellt werden
dann gibt es die datei "profil_"+name+"_profil.txt" überhaupt? wenn nicht dann einfach WFile=WriteFile (genau diese) und closefile WFile. und schon hat sich evtl das problem gelöst.

für openfile
-> ProfilStream=ReadFile("temp\"+DatumAktuell+"\profil_"+name+"_profil.txt") <-
muss der komplette pfad vorhanden sein! wenn nicht kann auch nichts geöffnet werden.

der fehler liegt meistens in dem datei namen oder im pfad...

z.b. DatumAktuell ="" würde bei dir bedeuten \\ das gibt 100% ein error.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Mathias-Kwiatkowski

BeitragDo, Nov 12, 2015 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
sorry 100% verlesen
EDIT - > Sorry doppelpost.... <- moment ich schau grad wie man in BB nochmal daten laden kann aber definitief nicht über openfile


also habe etwas gefunden Very Happy

Code: [AUSKLAPPEN]
stream = WriteFile("LOKAL_PFAD_DATEINAME.ENDUNG")
WriteLine stream,"[InternetShortcut]"
WriteLine stream,"URL = http://DOMAIN/ORDNER/DATEI.ENDUNG"
CloseFile stream


Warum Write File? ganz klare sache weil du im stream schreibst denke ich mir mal.


in bmax wäre es so einfach Very Happy
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017
 

Rocys

BeitragDo, Nov 12, 2015 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für Deine Antworten!
Die zweite verstehe ich leider nicht ganz, vielleicht magst Du das noch mal erklären?
Zu Deinen Fragen:

Den Ordner "DatumAktuell" gibt es. Es werden ja auch einige hundert Dateien aus ihm problemlos gelesen.
Die Datei "profil_"+name+"_profil.txt" gibt es auch. Habe ich mit dem Explorer überprüft und Filetype gibt bei der Fehlermeldung auch 1 zurück.

EDIT:
Im ProfilStream möchte ich übrigens nicht schreiben, sondern die Datei soll nur ausgelesen werden.

Mathias-Kwiatkowski

BeitragDo, Nov 12, 2015 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
so also nun hoffe ich habe ichs (was habe ich gemacht, auf mein Root sowie Lokalen Apatche eine datei abgelegt etwas in der datei reingetippt und nur diesen inhalt wollte ich auslesen.)

und genau das geht so:
Code: [AUSKLAPPEN]
tcp = OpenTCPStream("127.0.0.1", 80)
If Not tcp Print "Fehlgeschlagen": WaitKey : End
Print "Verbunden! Sende Anfrage..."
WriteLine tcp, "GET http://127.0.0.1/bb/test.txt HTTP/1.0"
WriteLine tcp, Chr$(10)
If Eof(tcp) Print "Fehlgeschlagen.": WaitKey: End
Print "######################################"
Print "Anfrage gesendet! Warte auf Antwort..."
Print "######################################"
;Das hier nur um datei Auszulesen ohne TCP HEADER!"
While Not Eof(tcp)
 If ReadLine$( tcp )="" Then Exit    
Wend
;Ab nun wird die dateu ausgelesen
While Not Eof(tcp)
   Print ReadLine$( tcp )
  ;Print "Bytes verfügbar:" + ReadAvail(tcp)
Wend
Print "######################################"
If Eof(tcp) = 1 Then
   Print "Erfolgreich!"
Else
   Print "Fehler!"
EndIf
CloseTCPStream tcp
WaitKey()

;Wichtig hierbei ist:
; -> tcp = OpenTCPStream("127.0.0.1", 80)
;und das
; -> WriteLine tcp, "GET http://127.0.0.1/bb/test.txt HTTP/1.0"
; -> WriteLine tcp, Chr$(10)



Ähm hier der beweis das es 100% geht
user posted image
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragDo, Nov 12, 2015 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@Mathias: ich glaube du hast dich noch immer verlesen.

@Rocys: Ohne Code kann man dir nicht weiterhelfen.
Das ist das Mindeste. Wir sind keine Hellseher.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragDo, Nov 12, 2015 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke es wird nun das richtige sein. Weil.

Zitat:
Mein Programm soll eine große Menge an Dateien (ca. 2.500) aus dem Internet laden


Das würde bedeuten er wil Daten laden aber nicht speichern. Der Code entspricht nun nur das auslesen.(also das was er will) Man könnte ja auch bytes auslesen.

Da ich nicht weiß was er für Daten auslesen will oder wozu. Schränkt es mich ein wenig ein, um genau das Problem anzugehen was er eigentlich hat.

Weil Daten aus dem Internet laden kann viel bedeuten.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Eingeproggt

BeitragDo, Nov 12, 2015 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab da aufgeschnappt, die Daten werden mit cURL geladen?
Wie genau sieht da der Aufruf aus? Und würde eventuell etwas simples wie ein Delay helfen? (Dass man mit dem Delay zB noch eine Sekunde wartet bis cURL wirklich alle Handles auf die Datei freigegeben hat).
Was spricht dagegen, es so wie Mathias vorgeschlagen hat, in Blitz direkt zu laden? Eventuelles HTTPS? Dann gehts wirklich nur mit cURL fürcht ich.

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Rocys

BeitragDo, Nov 12, 2015 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
vielen, vielen Dank für Eure Hilfe. Ich bin offenbar nicht wirklich gut darin, mein Problem zu beschreiben, deshalb hier mal ein Pseudo-Code, der beschreibt, was das Programm tun soll:

1. Per cURL eine Liste laden. (Funktioniert)
2. Aus der Liste alle URLs lesen, die später runtergeladen werden sollen. (Funktioniert)
3. Alle Dateien per cURL von ihren jeweiligen URLs laden. (Funktioniert)
4. Nacheinander alle bereits geladenen Dateien öffnen und analysieren.

Bei 4. trat der Fehler auf: Obwohl die Dateien definitiv auf meinem Rechner vorhanden waren (Explorer zeigte sie an und Filetype gab 1 zurück), kam die Fehlermeldung "Memory Acces Violation" bzw. bei aktiviertem Debugmodus "Stream does not exist" (oder so :D).

Ein Delay nach cURL hatte ich schon eingebaut. cURL war lange fertig mit laden, wenn die Analyse begann. (BTW: Ich hatte cURL tatsächlich wegen HTTPS verwendet).

Sorry, dass ich nicht mehr Code geliefert habe. Das sind nämlich ca. 1000 Zeilen Parser (der sehr, sehr, sehr konfuse html-Dateien systematisch zerlegen muss) und die wollte ich Euch nicht antun. Leider habe ich mich in diesem Wust dann auch verlaufen...

Hier des Rätsels Lösung:
Am Ende der Analyse habe ich jeweils eine TXT-Datei per Writefile geöffnet, in die die Ergebnisse geschrieben wurden. Dummerweise habe ich es vergeigt, diese Streams wieder zu schließen. Offenbar war Blitzbasic dann überfordert von den vielen geöffneten Streams (meine Vermutung: Bei 1024 offenen Streams ist Schluss). Ich habe jetzt dafür gesorgt, nicht nur die Lesestreams, sondetrn auch die Schreibstreams wieder zu schließen - siehe da: keine Fehlermeldung mehr.

Sorry, dass ich hier Alarm gemacht habe mit so einem Flüchtigkeitsfehler. Aber ich muss auch sagen, ich finde die Fehlermeldung in dem Fall sehr, sehr dürftig und irreführend... Vielleicht sollte man die Onlinehilfe ergänzen, dass so ein Fehler auch bei zu vielen offenen Streams auftaucht?

Xeres

Moderator

BeitragDo, Nov 12, 2015 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht Blitzbasic ist überfordert, das Betriebssystem (oder die zugrunde liegende Bibliothek) hat ein Limit von Dateien, die gleichzeitig geöffnet sein können.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Cykid

BeitragFr, Nov 13, 2015 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Bedeutet das, dass der Kernel "nur" 1024 Zugriffe erlaubt? Ist das Prozess gebunden oder sind diese im ganzen System limitiert?

Thunder

BeitragFr, Nov 13, 2015 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne es jetzt in Windows getestet zu haben:

Ja es ist wahrscheinlich ein Limit pro Prozess. Nein, es bedeutet nicht, dass man mehrere Prozesse starten sollte, um das zu umgehen.
Man sollte nie so viele Dateien offen haben. Wenn du die Dateien nacheinander liest, reicht es sie nacheinander auf und zu zu machen. Wenn du sie gleichzeitig/abwechselnd liest, zwingst du wahrscheinlich deine Festplatte in die Knie -> keine gute idee.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragFr, Nov 13, 2015 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist alles viel komplizierter
Zitat:
The top level serves as pointers into the mid-level tables and includes 1024 entries per-page on 32-bit Windows.

...aber für unsere Zwecke hier mit BlitzBasic würde ich schätzen, dass bei 1024 Schluss ist.


Solange man nicht tausende Dateien gleichzeitig offen halten muss, gibt es keinen guten Grund das zu tun. Seit sorgfältig, recycelt eure Bits und schließt Sachen wieder, die ihr geöffnet habt.
Man kann auch BlitzBasics Limit an lokalen variablen erreichen. Aber wenn man das tut, gibt es auch keine Frage, ob man selber oder Mark Sibly der schlechtere Programmierer ist...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group