Warum sollte fopen nicht öffnen Sie eine Datei, die vorhanden ist?
Bin ich auf Windows XP mit Visual Studio 6 (ja ich weiß, es ist alt) Bau/Erweiterung einer C++ - DLL. Ich bin auf ein problem gestoßen mit fopen scheitern, um eine vorhandene Datei zu öffnen, ist es immer NULL zurück.
Ich versucht habe:
- Prüfen von errno und _doserrno durch setzen beide auf null, und dann überprüfen Sie Sie wieder, bleiben beide null, und damit GetLastError() meldet keine Fehler. Ich weiß fopen ist nicht erforderlich, setzen Sie errno, wenn es auf einen Fehler laut C-standard.
- Hart codierten Pfad der Datei, die sind nicht relativ.
- Versucht, auf ein anderes Entwickler-Maschine, die das gleiche Ergebnis.
Die wirklich seltsame Sache ist CreateFile funktioniert und die Datei kann gelesen werden mit ReadFile. Wir glauben, dass diese Werke in einem release-build, jedoch sehen wir einige sehr merkwürdige Verhaltensweisen in anderen Bereichen der Anwendung und wir sind nicht sicher, ob dies ist verwandt.
Den code ist unten, ich sehe nicht, etwas seltsam sieht es ziemlich standard für mich. Die Quell-Datei hat sich nicht geändert, seit knapp einem halben Jahr.
HRESULT CDataHandler::LoadFile( CStdString szFilePath )
{
//Code
FILE* pFile;
if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) )
{
return S_FALSE;
}
//More code
}
Oh, und wie für die Frage, prüfen Sie, ob Sie über die Berechtigung zum Zugriff auf die Datei. Es muss nicht nur vorhanden sein: dein Programm muss in der Lage sein, darauf zuzugreifen.
Ja, wir bekommen es, VC++ 6.0 ist nicht Standard-konform. Aber es ist verwirrend, den Menschen zu sagen, es ist nicht C++, wenn es sehr klar zu sein behauptet. Es ist sicherlich nicht C, also was ist die alternative? Ich Stimme völlig, dass tagging-C-und C++ ist unsinnig.
Es ist nicht C++. Es ist nicht kompatibel " (wie Sie sagen) zu viele Möglichkeiten, richtig oder verantwortungsvoll bezeichnet als C++. Es ist eine C++-ähnliche Sprache. Ich Schätze, dass das mag dramatisch, aber es wird ein großer Unterschied, wenn man jemandem zu helfen, der code, der wurde beworben als C++, aber ist wirklich nicht unterliegen den gleichen Gesetzen.
Diese arbeiteten Punkt über C++ Einhaltung von VC6 ist völlig irrelevant für die Frage, die tatsächlich über einen Aufruf der C-standard-Bibliothek, auch wenn Sie aus C++ (oder was auch immer Tomalak meint, wir sollten rufen Sie die Sprache, die der VC6 C++ - compiler kompiliert)
InformationsquelleAutor void | 2011-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort:
Fand ich die Ursache, zu viele offene Datei-handles verursachen, indem Sie einige der jüngsten updates für die Anwendung. Sind diese, wo keine code-änderungen, obwohl, so dass dieser bug schon seit einer Weile. Ich trat in die fopen-Funktion nach unten, um eine Funktion namens _getstream. Diese versuche zu finden, ein stream nicht in Gebrauch, die Funktion sucht in einer Tabelle von 512 streams Sicher genug, alle 512 wo im Einsatz und andere Aufrufe von fopen, wo Sie scheitern. Ich benutzte die Griff tool von sysinternals, um zu sehen, die Anzahl der verwendeten Griffe.
InformationsquelleAutor void
Ihre Funktion hat ein HRESULT zurück geben (wo 0 ist gut), aber Sie geben einen booleschen Wert zurück (0 ist schlecht). Das kann nicht richtig sein...
InformationsquelleAutor trojanfoe
Vorausgesetzt, Sie haben eine vernünftige version von VC6, dann haben Sie den source-code der CRT, und Sie können Schritt für Schritt in die fopen-Aufruf, und den ganzen Weg hinunter zu der CreateFile-Aufruf, dass die CRT zu machen. (Vorbereitet für Sie ein ziemlich langer Weg nach unten!)
InformationsquelleAutor Will Dean
setzen Haltepunkt auf der fopen-Zeile, lösen Sie es im debugger, Eingang "ERR, hr" im "Watch" - Fenster, führen Sie die Linie und den check-in Sehen Sie, was das problem war. Wahrscheinlich die Zugriffsrechte.
InformationsquelleAutor Andriy Tylychko
Sie bereits mit 512 geöffneten Dateien.
Wir können halt nur max 512 Dateien in VC-Anwendung. Ich schlage vor, schließen Sie nicht benötigte Dateien mit
fclose
.InformationsquelleAutor rashok