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.
-
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; }
-
Du hast recht. Ich kann das Problem auch über CMD.EXE nachvollziehen.
dir c:\Programmeliefert 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
-
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.