Verschiedene system()-Befehle



  • Hallo,

    Ich habe diverse Fragen was den system() Befehl in C angeht und wie man die Ergebnisse dieser auslesen könnte.

    1. Der klassische cd Befehl zeigt den Pfad an, in dem man sich aktuell befindet. Der wird in der Konsole angezeigt, wie kann ich den "auslesen" und in einem String speichern?

    system("cd");
    

    2. Ich möchte per cd *Hier Pfadeingabe* zu dem eingegebenen Pfad navigieren. Geht das überhaupt während des Programms in der Programmkonsole oder müsste ich einen externen cmd.exe Prozess aufrufen?
    Wenn ja, wie mache ich das und wie kann ich dann dann in dem externen Prozess einen Befehl ausführen lassen?

    system("cd C:\ ");
    

    zeigt mir auch lediglich den aktuellen Pfad an, das C:\ wird ignoriert. Warum?

    3. Schlussendlich der DIR Befehl, der alle Directories anzeigt. Den rufe ich mit

    system("DIR");
    

    auf, das funktioniert auch. Same Problem here: Wie kann ich mir das Ergebnis des Befehls in einem String einspeichern?



  • TocToc schrieb:

    system("cd C:\ ");
    

    Ein \ zu wenig

    system("cd C:\\");
    

    TocToc schrieb:

    system("cd");
    

    Ich bin mir nicht sicher, aber vielleicht:

    system("cd > tmp.txt");
    

    Dann eben die Textdatei auslesen.
    Das selbe bei Dir.


  • Mod

    system (kleingeschrieben!) erzeugt einen neuen Prozess mit einer neuen Instanz des Kommandozeileninterpreters. system gibt als Rückgabewert lediglich den Rückgabewert (exitcode) des aufgerufenen Kommandos zurück.

    system ist das völlig falsche Mittel für dein Vorhaben. Überhaupt ist system für so ziemlich jedes Vorhaben das falsche Mittel.

    Du musst die Funktionen deines Betriebssystems bemühen, wenn du solch betriebssystemspeziefische Dinge wie Dateisystempfade manipulieren möchtest.



  • SeppJ schrieb:

    system (kleingeschrieben!)

    Unter Windows geht auch groß oder gemischt.

    system("dIr");
    


  • Bitmapper schrieb:

    TocToc schrieb:

    system("cd C:\ ");
    

    Ein \ zu wenig

    system("cd C:\\");
    

    Das funktioniert leider auch nicht, habe ich auch schon probiert...

    system (kleingeschrieben!) erzeugt einen neuen Prozess mit einer neuen Instanz des Kommandozeileninterpreters. system gibt als Rückgabewert lediglich den Rückgabewert (exitcode) des aufgerufenen Kommandos zurück.

    system ist das völlig falsche Mittel für dein Vorhaben. Überhaupt ist system für so ziemlich jedes Vorhaben das falsche Mittel.

    Du musst die Funktionen deines Betriebssystems bemühen, wenn du solch betriebssystemspeziefische Dinge wie Dateisystempfade manipulieren möchtest.

    Was wäre denn richtig? Mit ShellExecute habe ich jetzt einen externen Prozess geöffnet, wie kann ich in diesem Kommandos ausführen?


  • Mod

    Das bezog sich auf system, nicht dessen Parameter Inhalt.



  • Achso okay. Trotzdem Ideen? 😃



  • Was willst du denn überhaupt machen? Willst du cmd nachbauen?
    Wahrscheinlich gibt es für dein Vorhaben eine einfachere Lösung.



  • Ich will/muss in meinem Programm in einen bestimmten Pfad navigieren, wo ich alle möglichen Dateien erkennen will. Und das geht nun mal am Besten (nach meinem bisherigen Stand) mit dem CD und DIR Befehl....

    EDIT: Mir ist gerade die spontane Idee einer Batch-Datei gekommen. Der benutzer gibt den per fgets() den Pfad ein, wo die Dateien liegen. In der Batch Datei steht dann:

    cd C:\.....
    DIR
    hier ggf. pause
    

    Bleibt also nur noch die Frage des auslesens...



  • CD und DIR haben nicht mit C zu tun, das sind lediglich Befehle die Microsoft, werauchimmer in sein Programm eingebaut hat.
    Lass den Benutzer doch einfach die Pfade eingeben (fgets) und bringe sie mit strcat dann so zusammen, dass du die Dateien mit fopen öffnen kannst.
    Übrigens: system nie mit benutzerdefinierter Eingabe aufrufen, ist denke ich selbsterklärend 🙂

    cd C:\..... 
    DIR > file.txt
    hier ggf. pause
    

    Ist zwar umständlich aber geht, die Datei file.txt dann im Programm einlesen.
    Die Portabilität ist dann natürlich gleich 0.



  • Solche sachen sind plattformspezifisch. Unter Windows kannst du FindFirstFile etc. benutzen.



  • Dass cd und dir keine C commands sind ist mir schon klar... xDD
    Aber was bedeutet denn das > im DIR Command?
    Und es geht um ALLE Dateien in dem Verzeichnis, nicht nur um .txt Dateien



  • #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argv, char *argc[])
    {
    	FILE *Batch;
    	char Pfad[50];
    	printf(" Pfad mit Doppel-Schraegstrich eingeben: ");
    	fgets(Pfad, sizeof(Pfad), stdin);
    	Batch = fopen("TEST.bat", "w");
    	fprintf(Batch, "cd %s", Pfad);
    	fprintf(Batch, "DIR\n");
    	fprintf(Batch, "Pause");
    	fclose(Batch);
    	return(0);
    }
    

    Das ist mein bisher funktionierender Pseudo-Code für die erstellen der .bat Datei. Bleibt nur noch das Auslesen des Ergebnisses. Hat da jemand eine Idee? Hat nicht mehr wiklich viel mit C zutun, kennt sich da trotzdem jemand in dem Bereich aus der weiß wie man die Ergebnisse in einem weiteren Text File oder im Cache abspeichert?



  • TocToc schrieb:

    weiß wie man die Ergebnisse in einem weiteren Text File oder im Cache abspeichert?

    Hab ich doch schon 2 mal versucht zu zeigen:

    DIR > file.txt
    

    In der Batch Datei schreibt das, was eigentlich von DIR ausgegeben würde in die Datei file.txt, ist egal wie die heißt kannst du auch abc.def nennen.
    Sprich: du hast dann Alle Dateien im Verzeichnis in file.txt / abc.def stehen und kannst sie mit fopen + fgets auslesen.



  • Achsoooo danke sorry Bitmapper das habe ich ganz anders verstanden tut mir Leid 😃 😃 😃



  • Vielen Dank an alle, damit ist mein Problem gelöst, Thread kann geschlossen werden 🙂


  • Mod

    Das mit der Datei ist keine gute Idee. Wie schon gesagt, ist system überhaupt fast nie eine gute Idee. Wenn du Ausgaben von Unterprozessen haben möchtest, musst du eine Pipe zu dem neuen Prozess herstellen. Je nach System kann das sehr einfach (Linux) oder etwas komplizierter (Windows) sein.

    Aber das Erstellen von Unterprozessen zum Zweck eines Verzeichniswechsels oder zum Lesen des Inhalts eines Verzeichnisses ist sowieso Unsinn, aus gleich mehreren Gründen:
    1. Neue Prozesse zu erstellen ist ein langsamer und aufwendiger Vorgang.
    2. Der neue Prozess hat doch sein eigenes Arbeitsverzeichnis! Eine Änderung merkt der Mutterprozess überhaupt nicht.
    3. Es gibt fertige Funktionen in der Betriebssystem-API dafür. Darauf wurde auch bereits hingewiesen.



  • #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    
    int main(int argv, char *argc[])
    {
    	FILE *Batch;
    	char Pfad[50];
    	printf("\n Pfad angeben: ");
    	fgets(Pfad, sizeof(Pfad), stdin);
    	Batch = fopen("CMD_Kommandos.bat", "w");
    	fprintf(Batch, "cd %s", Pfad);
    	fprintf(Batch, "DIR > C:\\Users\\jcremer\\Desktop\\Batchdatei\\Ergebnis.txt\n");
    	fprintf(Batch, "timeout /t 3 /nobreak\n");
    	fclose(Batch);
    	ShellExecute(NULL, "open", "C:\\Users\\jcremer\\Desktop\\Batchdatei\\CMD_Kommandos.bat", NULL, NULL, SW_NORMAL);
    	//remove("C:\\Users\\jcremer\\Desktop\\TEST.bat");
    	return(0);
    }
    

    Will sagen, dass sind nicht ungebedingt viele Zeilen Code und bevor ich mich kompliziert in die API reinarbeite mache ich das lieber auf diese Art und Weise 🙂

    Einziger Nachteil: Der Benutzer muss den Pfad korrekt eingeben...

    Ach ja, und ich kann das anschließende Datei-Auslesen gleich mal wieder üben.. 😉


  • Mod

    Wenn dies ein neuer Thread wäre, würde ich dieses Programm für einen Scherzbeitrag halten.

    Aber da du offensichtlich keine richtige Hilfe willst, ziehe ich mich aus diesem Thread zurück.



  • Ich sag dazu mal gar nix. Außer lächerlich wieder so ein TamTam drum zu machen -.-


Anmelden zum Antworten