Problem mit Pfadangaben bei Dateioperationen



  • Ne das mein ich nicht.

    Ich lade nur den Hilfetext aus einer Datei in meinem Programmverzeichniss.

    Bloß das geht halt nur solange gut bis jemand wo anders hinspeichert und dann das "Current Working Direcoty" geändert wird.

    Denn dann findet meine Funktion die Hilfedatei nicht mehr.

    Somit muss ich meiner funktion irgendwie sagen wo die Datei liegt auch wenn das Working Directoy ein anderes ist.
    Denn den kompletten pfad kann ich ja nicht übergeben da es ja auch auf anderen pcs laufen muss.
    In mein Programmverzeichniss wird nichts gespeichert.

    char buf[256];
    GetModuleFileName(NULL, buf, 255);
    CString strPfad;
    strPfad.Format("%s", buf);
    int nTmp = strPfad.ReverseFind('\\');
    strPfad.Delete(nTmp,strPfad.GetLength()-nTmp);
    

    Denke das könnte mir weiterhelfen.

    Allerdings kennt er das CString nicht, gibts das nicht in C?



  • ok habs jetzt mal was geschrieben und oh wunder es klappt nicht...

    Habe mittels GetModuleFileName den Pfad meines Programms rausgefunden.

    Jetzt will ich natürlich nur den Pfad zum Verzeichniss ohne die *.exe hinten dran.
    Also habe ich mal das hier geschrieben.

    FILE *fp;
    	char *buffer;
    	char *ptoken;
    	char *temp;
    	int iFileSize; 
    	int anz = 0, lv = 0, cn = 0;
    	char szFileName[MAX_PATH];
    
    	GetModuleFileName(NULL, szFileName, MAX_PATH);
    	anz = strlen(szFileName);
    
    	for(lv = 0; lv <= anz; lv++)
    	{
    		if(szFileName == '\\')
    		{
    			cn++;
    			*(szFileName+1);
    		}
    	}
    
    	for(lv = 0; lv < cn; lv++)
    	{
    		while(szFileName != '\\')
    		{
    			temp = szFileName;
    			*(szFileName+1);
    			*(temp+1);
    		}
    	}
    	MessageBox(hdlg, temp, "This program is:", MB_OK | MB_ICONINFORMATION);
    

    als erstes hole ich mir die Stringlänge, dann suche ich die Anzahl der "\" im Pfad. In der letzten for Schleife wollte ich den String in einen Anderen kopieren. Es sollte solange laufen wie "\" vorhanden sind.

    Natürlich klappt es nicht. Er stürzt beim MessageBox befehl ab, aber ich glaub es liegt daran wie ich die String "behandle", finde aber nicht meinen Fehler.

    Ich versteh auch nicht warum ich oben den String nicht mit temp++ "hochzählen" kann.

    In diesem Programm geht es ja:

    char * string_cat(char *s1Ptr, char *s2Ptr)
    {
    	int lv, x, y;
    	char *sPointer;
    
    	sPointer = s1Ptr;
    
    	x = string_laenge(s1Ptr);
    	y = string_laenge(s2Ptr);
    
    	for(lv = 0; lv < x; lv++)
    	{
    		s1Ptr++;
    	}
    
    	for(lv = x; lv < (y+x); lv++)
    	{
    		*s1Ptr = *s2Ptr;
    		s1Ptr++;
    		s2Ptr++;
    	}
    
    	*s1Ptr = '\0';
    
    	return sPointer;
    }
    


  • Vergessen wir mal die 2 letzten Posts.

    FILE *fp;
    	char *buffer;
    	char *ptoken;
    	char *temp ;//= {"..."};
    	char temp1[MAX_PATH];
    	char *str1;
    	int iFileSize; 
    	int anz = 0, lv = 0, cn = 0;
    	char szFileName[MAX_PATH];
    
    	GetModuleFileName(NULL, szFileName, MAX_PATH);
    
    	str1 = strrchr(szFileName, (char)'\\');
    	anz = (strlen(szFileName)) - (strlen(str1));
    	temp = malloc(sizeof(szFileName));
    
    	strncpy(temp, szFileName, anz);
    
    	MessageBox(hdlg, temp, "This program is:", MB_OK | MB_ICONINFORMATION);
    

    das ist mein neuester Ansatz:
    ich ermittle per GetModuleFileName den Pfad.
    Dann hole ich mir die Länge des Gesamtstrings (vom kompletten Pfad).
    Dann hole ich mir per Strrchr dasletzte Auftauchen des "\"
    Ich ermittle dann die Länge des String welcher mir von Strrchr gegeben wird.
    Diese Länge ziehe ich von der Länge des Gesamtstrings die Länge von meinem Str1 (den ich von strrchr erhalten hab) ab.
    Somit bekomme ich Die Länge des Strings welchen ich haben will (Pfadangabe ohne die Exe).

    Jetzt könnte ich ja per Strncpy den gesamtstring in einen neuen kopieren, in dem ich meine ermittelte Länge dazu übergebe würde er ja nur den Pfad kopieren ohne die exe.

    Aber genau hier liegt das Problem, es will irgendwie nicht richtig...muss ich strncpy ein char Array übergeben? warum geht kein char *? weil szFileName schon ein Array ist?

    Edit: So funktioniert es fast.
    Die MEssageBox gibt den Pfad ohne die Exe an aber dahinter werden noch ein haufen Müllzeichen mit ausgegeben, kann jemand sagen wieso?

    edit2:

    So wies aussieht funktioniert das sowieso nicht, hab grade mal testweiße eine Release Version erstellt. Wenn ich jetzt starte gibt er mir jedesmal andere Pfade zurück...so ein dreck...



  • Versuche mal folgenden Code:

    // Programm-Verzeichnis auslesen
    CHAR szAppPath[MAX_PATH];
    GetModuleFileName(NULL,szAppPath,sizeof(szAppPath));
    *(strrchr(szAppPath,'\\')+1) = 0;
    


  • Kann man die Wahrscheinlichkeit, dass GetModuleFileName fehlschlägt, strrchr in Folge NULL zurückgibt und man in 0x00000001 schreibt, vernachlässigen?



  • Badestrand schrieb:

    Kann man die Wahrscheinlichkeit, dass GetModuleFileName fehlschlägt, strrchr in Folge NULL zurückgibt und man in 0x00000001 schreibt, vernachlässigen?

    Hm, nee - sollte man wohl besser nicht vernachlässigen 🙄



  • Und was sollen dann die rolling eyes? War IMHO ne berechtigte Frage.



  • ehm tut mir leid, was meint ihr?

    Wieso sollte die Funktion fehlschlagen?
    Kann man das irgendwie abfangen und ne Fehlermeldung ausgaben?
    Gibt Sie NULL zurück beim fehlschlag?

    Bis jetzt scheint dein Code wunderbar zu funktionieren.



  • Die Funktion GetModuleFileName kann fehlschlagen was aber IMO recht unwahrscheinlich ist.
    Du kannst einfach den Rückgabewert von GetModuleFileName prüfen, muss != 0 sein. Wenns nicht geklappt hat, dann halt nicht die strrchr-Zeile ausführen 🙂



  • Ich wollte mit dem 🙄 eher zum Ausdruck bringen, dass ich etwas verlegen war. Natürlich sollte man überprüfen, ob GetModuleFileName fehl schlägt...


Anmelden zum Antworten