Shell mit aktueller Pfadangabe...



  • Hab folgendes zusammengebastelt:

    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <tchar.h>
    #include <sstream>
    #include <vector>
    
    using namespace std;
    
    string ApplicationDirectory();
    
    //***Global***
    string Pfad = ApplicationDirectory();
    
    string ApplicationDirectory()
    {
    	TCHAR szPathName[_MAX_PATH];
    	::GetModuleFileName(NULL, szPathName, _MAX_PATH);
    	LPTSTR pszFileName = _tcsrchr(szPathName, '\\') + 1;
    	*pszFileName = '\0'; 
    
    	return szPathName;
    }
    
    //Ausgabe Prompt
    void prompt()
    {	
    	cout << Pfad << ">>";
    }
    
    int main()
    {
    	string str;
    	do
    	{
    		//Setzt den aktuellen Pfad
    		SetCurrentDirectory(Pfad.c_str());
    		prompt();
    
    		getline(cin, str);	
    
    		istringstream cmdline (str);
    		string input;
    		vector<string> params;
    
    		string tmp;
    		while (cmdline >> tmp) 
    		{
    			params.push_back (tmp);
    		}
    
    		if(params.size() >= 2)
    		{
    			if(params[0] == "cd")
    			{
    				cout << "Wechsel zu -> " << params[1] << endl;
    				Pfad = params[1];
    			}
    		}
    		if(params.size() >= 1)
    		{
    			if(params[0] == "exit")
    				return 0;
    			if(params[0] == "dir")
    				system("dir");
    
    		}
    
    	}while(1);
    	return 0;
    }
    

    Es funktioniert jetzt, gibt es aber noch Verbesserungsvorschläge und wie kann ich prüfen ob der Pfad bei cd auch existiert

    Beispiel:

    *cd x:* // Fehler x existiert nicht!


  • Mod

    PathIsDirectory



  • Das mit der Überprüfung funktioniert jetzt 🙂
    Hab da ein nächstes Problem(e), wenn ich mich z.B. im Verzeichnis c:\ befinde wird auch in der Prompt c:\ angezeigt, doch wenn ich dann in ein weiteres Unterverzeichnis wechseln will wie z.B. Windows dann wird in der Prompt nur Windows angezeigt und nicht der volle Pfad: *c:\windows*
    Die Shell weiß das sie sich im verzeichnis c:\windows befindet, nur der Prompt muss ich dies noch irgendwie mitteilen. Ich dachte mir wenn ich das neue Unterverzeichnis dem string Pfad dazuaddiere, also pfad += params[1] dann würde der ganze Pfad stimmen doch das problem ist wenn ich in ein andere Partition wechseln will wie x: dann sehe der string so aus:

    Pfad = c:\windows\x:\... //es wird immer dann was dazu addiert.

    Wie würdet ihr das lösen??



  • Hier nochmal mein überarbeiteter Code:

    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <tchar.h>
    #include <sstream>
    #include <vector>
    #include <Shlwapi.h>
    
    using namespace std;
    
    #pragma comment(lib, "Shlwapi.lib")
    
    string ApplicationDirectory();
    
    //***Global***
    string Pfad = ApplicationDirectory();
    
    string ApplicationDirectory()
    {
    	TCHAR szPathName[_MAX_PATH];
    	::GetModuleFileName(NULL, szPathName, _MAX_PATH);
    	LPTSTR pszFileName = _tcsrchr(szPathName, '\\') + 1;
    	*pszFileName = '\0'; 
    
    	return szPathName;
    }
    
    int checkDir(string str)
    {
    	if (PathIsDirectory(str.c_str()))
    		return 1;
    	else
    		return 0;
    }
    
    //Ausgabe Prompt
    void prompt()
    {	
    	cout << Pfad << ">>";
    }
    
    int main()
    {
    	string str;
    	do
    	{
    		//Setzt den aktuellen Pfad
    		SetCurrentDirectory(Pfad.c_str());
    		prompt();
    
    		getline(cin, str);	
    
    		istringstream cmdline (str);
    		string input;
    		vector<string> params;
    
    		string tmp;
    		while (cmdline >> tmp) 
    		{
    			params.push_back (tmp);
    		}
    
    		if(params.size() >= 2)
    		{
    			if(params[0] == "cd")
    			{				
    				//Pfad = params[1];
    				if(checkDir(params[1]) == 1)
    				{
    					Pfad = params[1];
    				}
    				else
    					cout << "Verzeichnis '" << params[1] << "' nicht gefunden" << endl << endl;
    
    			}
    		}
    		if(params.size() >= 1)
    		{
    			if(params[0] == "exit")
    				return 0;
    			if(params[0] == "dir")
    				system("dir");
    
    		}
    
    	}while(1);
    	return 0;
    }
    

    Ich hoffe Ihr könnt mir helfen, das Programm startet dort wo es kopiert wurde z.B. *F:\test* jetzt möchte ich in nach *c:* wechseln, gebe hierfür *cd c:* ein. In der Prompt steht jetzt c:\>> anschließend möchte ich in das Windows verzeihnis wechseln und gebe hierfür cd windows ein, jetzt steht in der Prompt windows>> doch wie kann man den ganzen Pfad ausgeben, hier c:\windows>>

    Bitte um Hilfe!



  • GetCurrentDirectory!?
    GetFullPathName !?



  • Vielen Dank 🙂
    Noch ein kurze Frage, wie kann man das folgende verbessern damit das feld keine feste größe hat, damit es zu keinem Bufferoverflow kommt.

    char app_name[300]; 
    GetCurrentDirectory(300, LPWSTR(app_name)); // aktuelles Verzeichnis holen...
    


  • Doku lesen

    To determine the required buffer size, set this parameter to NULL and the nBufferLength parameter to 0.

    und dann:

    DWORD dwReqSize = GetCurrentDirectory(0, NULL);
    TCHAR szCurDir = new TCHAR[dwReqSize+1];
    GetCurrentDirectory(dwReqSize+1, szCurDir);
    // ....
    delete [] szCurDir;
    

    PS: Warum castest Du ein "char" nach "LPWSTR"????? Das geht auf jeden Fall schief!



  • Hab mit deinem Beispiel 3 Fehler:

    error C2440: 'Initialisierung': 'TCHAR *' kann nicht in 'TCHAR' konvertiert werden
            Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    
    error C2664: 'GetCurrentDirectoryA': Konvertierung des Parameters 2 von 'TCHAR' in 'LPSTR' nicht möglich
    
    error C2541: 'delete': Objekte, die keine Zeiger sind, können nicht gelöscht werden
    


  • Sollte natürlich

    TCHAR *szCurDir = new TCHAR[dwReqSize+1];
    

    heissen...



  • Vielen Dank 🙂


Anmelden zum Antworten