Test ob Laufwerk (Netzlaufwerk) vorhanden ist.



  • Gibt es einen einfachen Weg herauszufinden, ob ein Laufwerk (z.B. G:) oder
    ein freigegebenes Netzwerkverzeichnis (z.B.: //MyComputer/frei ) aktuell vorhanden ist?
    Meine erste Idee war FindFirstFile, aber genau nach diesen Rootverzeichnissen darf man nicht suchen, und der angegebene Trick nach z.B.: "G:\*" zu suchen nützt mir auch nichts, da das Verzeichnis auch leer sein kann.
    FindFirstVolume gibts erst ab Windows 2000, es sollte aber auch noch auf Win NT gehen.
    Hat jemand Idee.

    Danke DJohn



  • Geht vielleicht wenn man versucht das Laufwerk via CreateFile("\.\G:",..) zu öffnen...



  • Danke, funktioniert.

    DJohn





  • @miller_m
    Ich habe PathFileExists getestet und es scheint zu funktionieren.

    In der SDK-Dokumentation steht aber:

    It works only on the local file system or on a remote drive that has been mounted to a drive letter. It will return FALSE for remote file paths that begin with the Universal Naming Convention (UNC) names \\ server or \\ server\ share.

    Danach sollte die Funktion mit Netzlaufwerken, die nicht einem Laufwerksbuchstaben zugeordnet sind, nicht gehen. Beim Testen hat es aber trotzdem geklappt.

    Ist das jetzt ein Fehler in der Dokumentation, oder hab ich das falsch verstanden?
    Oder gibt es da Unterschiede zwischen den einzelnen Windows-Versionen ?



  • ich verstehe es auch so das nur laufwerke die gemountet sind (laufwerksbuchstaben im explorer haben) funktionieren.
    wo der fehler liegt (doku oder windows) weis ich nicht 🙄



  • habe es mal in einen "grösseren" netzwerk getestet. es scheint wirklich zu gehen.

    #include <iostream>
    #include <windows.h>
    #include <Shlwapi.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	string tmp = "//pc5/e";
    
    	if(!PathFileExists(tmp.c_str()))
        {
            cout << "< " << tmp << " > Pfad nicht gefunden" << endl;
            cout << "GetLastError: " << GetLastError() << endl;
    
    		char *pMsg;
    
    		if(FormatMessage( 
    			FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    			FORMAT_MESSAGE_FROM_SYSTEM | 
    			FORMAT_MESSAGE_IGNORE_INSERTS,
    			NULL,
    			GetLastError(),
    			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    			(LPTSTR)&pMsg,
    			0,
    			NULL))
    		{
    			cout << "FormatMessage: " << pMsg << endl;
    		}
    
    		if(pMsg) delete pMsg;
    	}
        else
            cout << "< " << tmp << " > Pfad gefunden" << endl;
    
    	system("pause");
    	return 0;
    }
    


  • miller_m schrieb:

    if(pMsg) delete pMsg;
    

    LocalFree statt delete



  • Klugscheisser schrieb:

    LocalFree statt delete

    dein name sagt alles. 😃
    localfree geht auch, aber warum sollte ich nicht delete verwenden ? :p



  • Mit delete löscht man nur Sachen die mit new angelegt werden.

    Und FormatMessage ruft mit Sicherheit nicht new auf um den Speicher zu holen.

    Deswegen würd ich sagen => undefiniertes Verhalten


Anmelden zum Antworten