Daten/Verzeichnisse auflisten + Windows 7 [gelöst]



  • Huhu zusammen!
    Also ich habe ein kleines Problemchen.
    Undzwar gibt es ja in Windows 7 (Vista glaube ich auch) Ordner, die es garnicht wirklich gibt. Also den Ordner "C:\Programme" gibt es ja nicht wirklich - das ist nur eine interne Weiterleitung zu "C:\Program Files" (ich glaube virtuelle Ordner heißen die). Wenn ich jetzt aber im Sinne der FAQ (hier) nach Ordnern/Daten suche werden mir beide Ordner angezeigt. Jedoch kann ich den Inhalt von "Programme" nicht sehen - den von "Program Files" aber schon. Das gleiche ist auch mit "Eigene Bilder"(Prictures) und vielen weiteren Ordnern.
    Jetzt wollte ich gerne wissen, ob ich irgendwie feststellen kann, wohin ein virtueller Ordner (wenn es denn so heißt) führt.

    Hat jemand eine idee?

    **Edit:**Ich sehe grade: das einzige, was mit angezeigt wird, innerhalb von "C:\Progamme" ist angeblich eine Datei, die 'u" heißen soll.


  • Mod

    Es werden hier so genannte "Junctions" verwendet!
    Ich weißt nicht woher Du das hast. Es ist vollkommen egal welchen Pfad Du verwendest. Ob C:\Programme oder C:\Program Files, beide sind identsich. Auf beide kann man mit FindFirstFile etc. zugreifen.

    Das ist ja genau der Sinn dieser Sache!



  • Stimmt - wenn ich die Pfade per Explorer aufrufe stimmt das auch, aber wenn ich das per Funktion mache kommt eben NICHT das selbe bei rum.

    Wenn jemand anderes evtl auch Win 7 hat - ich post einfach mal meinen Quellcode. Wenn bei euch wirklich das Selbe bei rumkommt fände ich nen Hinweis nett 🙂

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    	HANDLE fHandle;
    	WIN32_FIND_DATA wfd;
    
    	fHandle=FindFirstFile("C:\\Programme\\*",&wfd);
    //	fHandle=FindFirstFile("C:\\Program Files\\*",&wfd);
    
    	FindNextFile(fHandle,&wfd);
    
    	while (FindNextFile(fHandle,&wfd))
    	{
    	    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    	    {
    	       printf("ORDNER: %s\n", wfd.cFileName);
    	    }
    	    else
    	    {
    	    	printf("DATEI : %s\n", wfd.cFileName);
    	    }
    	}
    	FindClose(fHandle);
    	return 0;
    }
    

  • Mod

    Du hast recht. Ich kann das Problem auch über CMD.EXE nachvollziehen.

    dir c:\Programme
    

    liefert auch kein Ergebnis.



  • Man kann über

    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
    {
     //...
    }
    

    rauskriegen obs nen Junction Point ist und hier hat jemand was gebastelt, um das Ziel des Junction Points rauszufinden:
    http://www.codeproject.com/KB/winsdk/junctionpoints.aspx
    (FSLinks.cpp - GetJunctionPointInfo...)



  • Ich habs!
    Vieeeeeeeelen Dank! Mit dem Stichwort von Martin (dass diese Dinger Junctions heißen) habe ich über Google die Infos zusammen bekommen und mir etwas zusammen gebastelt.
    Hier der Code, für alle die das gleiche Problem haben und sich viel Zeit ersparen wollen 🙂

    #include <windows.h>
    #include <iostream>
    #include <winioctl.h>
    
    #define PATH "C:\\Dokumente und Einstellungen"
    
    int main()
    {
    	HANDLE hFile;
    	char dir[200];
    	char *string;
    	BOOL rc;
    	DWORD size;
    	REPARSE_DATA_BUFFER *rep;
    
    	rep = (REPARSE_DATA_BUFFER*)malloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE);		//Buffer erstellen
    	strcpy(dir,PATH);
    
    	hFile = CreateFile(dir, FILE_READ_EA, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); //Handle des Ordner holen
    	if(hFile == INVALID_HANDLE_VALUE){
    		printf("CreateFile fehlgeschlagen: %i\n", (int)GetLastError());
    		return 0;
    	}
    
    	rc = DeviceIoControl(hFile, FSCTL_GET_REPARSE_POINT, NULL, 0, rep, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &size, NULL); //Reparse-Daten auslesen
    	if(rc == 0){
    		DWORD Error = GetLastError();
    		if(Error == 4390)
    			printf("Verzeichnis ist echt!\n");
    		else
    			printf("DeviceIoControl fehlgeschlagen: %i\n",(int)GetLastError());
    		CloseHandle(hFile);
    		delete(rep);
    		return 0;
    	}
    
    	if(IsReparseTagMicrosoft(rep->ReparseTag)){
    		if(rep->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT){				//Order ist ein Reparse-Point
    			int size = rep->MountPointReparseBuffer.PrintNameLength;	//Da der Buffer in Unicode ist - umwandeln in ASCII
    			string = new char[size];
    			for(int i=0;i<size;i++)
    				string[i] = rep->MountPointReparseBuffer.PathBuffer[(rep->MountPointReparseBuffer.PrintNameOffset / sizeof(WCHAR))+i];
    			printf("Echter Name: %s\n", string);
    			delete string;
    			break;
    		}
    	}
    
    	CloseHandle(hFile);
    	delete(rep);
    	return 0;
    }
    


  • Ich möchte dich noch auf Zeile 28 hinweisen, == muss es da heißen.



  • Kla - danke 👍 habs geändert


  • Mod

    Und der Grund warum man hier keine DIR/FindFirstFle machne kann ist mir jetzt auch klar.
    Die Rechte auf dieser Junction verbieten dass!

    Das OS setzt dies vermutlich um Rekursionen (z.B. bei der Dateisuche) zu vermeiden.


Anmelden zum Antworten