Seit NTFS-version 5 gibt es das Dateisystemattribut „Offline“.
Dieses wird leider nicht von den Tools „attrib“ oder „dir“ angezeigt, da diese Tools nie aktualisiert wurden.
Das Flag wird gesetzt, wenn Dateien von Backuplösungen (z.B. Commvault/Simpana) ausgelagert werden.
Zum Kompilieren des Programms muss auf dem Rechner ein C-Compiler (LCC) installiert sein.
Hier ist der Compiler (http://www.cs.virginia.edu/~lcc-win32) nach c:\programme\LCC installiert.
Danach kann das Programm getofflinefiles.exe
auf die Ordner losgelassen werden.
Die alte DOS-Beschränkung für MAX_PATH auf maximal 255 Zeichen sollte kein Problem sein, da dieses Programm gegen UNICODE kompiliert ist.
/* Liste alle Offlinedateien rekursiv auf! getOfflineFiles.exe -r -n \\meinUNCServer\meineDateien\ siehe auch http://en.literateprograms.org/Directory_listing_%28C,_Windows%29 Komplierung mit dem LCC-Compiler: lc getofflinefiles.c */ #ifndef UNICODE #define UNICODE #endif #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <wchar.h> #include <tchar.h> //------------------------------------------------------------------------------ // Globals... //------------------------------------------------------------------------------ WIN32_FIND_DATA *fd; UINT i= 1; #define LINUX_PATH 4096 // UNICODELänge sonst Pfad schnell zu kurz 32767 // wegen eventuellen sambafreigaben //------------------------------------------------------------------------------ // Protos... //------------------------------------------------------------------------------ int showdir(WCHAR *path, BOOL recursive, BOOL nummerierung); int fixpath(WCHAR *inpath, WCHAR *outpath); //------------------------------------------------------------------------------ // showdir() //------------------------------------------------------------------------------ int showdir(TCHAR *_path,BOOL recursive,BOOL nummerierung) { HANDLE fh; int attrib_a=0; int attrib_c=0; int attrib_d=0; int attrib_h=0; int attrib_n=0; int attrib_o=0; int attrib_r=0; int attrib_s=0; int attrib_t=0; int filecnt=0; TCHAR path[LINUX_PATH]; TCHAR tmppath[LINUX_PATH]; fd = malloc(sizeof(WIN32_FIND_DATA)); fixpath(_path,path); wcscat(path,L "*"); fh = FindFirstFileW( path,fd); if(fh != INVALID_HANDLE_VALUE) { do { filecnt++; if(fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if((0 != wcscmp(fd->cFileName,L".")) && (0 != wcscmp(fd->cFileName,L".."))) { fixpath(_path,tmppath); wcscat(tmppath,fd->cFileName); fixpath(tmppath,tmppath); if(recursive) showdir(tmppath,recursive,nummerierung); } } else { if(nummerierung) {if(fd->dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) wprintf(L "%d %s%s\n",i,_path,fd->cFileName) && i++;} else {if(fd->dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) wprintf(L "%s%s\n",_path,fd->cFileName) && i++;} } } while(FindNextFile(fh,fd)); } FindClose(fh); return 1; } //------------------------------------------------------------------------------ // fixpath() - Adds \ to the end of a path if not present. //------------------------------------------------------------------------------ int fixpath(TCHAR *inpath, TCHAR *outpath) { int n=0; wcscpy(outpath,inpath); while(inpath[n]) n++; if(inpath[n-1] != '\\') { wcscat(outpath,L "\\"); return 1; } return 0; } //------------------------------------------------------------------------------ // Entry point... //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { unsigned int recursive=0; unsigned int ndirs=0; unsigned int nummerierung=0; TCHAR tPfad[LINUX_PATH]; printf("Programm zut Anzeige von Offlinedateien auf NTFS-Dateisystemen : %s\n",argv[0]); printf("richard@borwinius.de / 2011\n\n"); if((argc == 1) || (argc > 4) ) { printf("Nutzung von : %s \n",argv[0]); printf("Schalter /n oder -n \t Anzeige einer fortlaufenden Nummerierung\n"); printf("Schalter /r oder -r \t Anzeige rekursiv auch der Unterverzeichnisse\n"); printf("Beispiel : %s -n -r h:\\meineDateien\\\n",argv[0]); printf(" oder : %s -n -r \\\\meinUNCServer\\meineDateien\\\n",argv[0]); return 1; } while(*++argv) { if(!strcmp(*argv,"-r") || !strcmp(*argv,"/r")) recursive=1; if(!strcmp(*argv,"-n") || !strcmp(*argv,"/n")) nummerierung=1; else { MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,*argv,-1,tPfad,LINUX_PATH); //Umwandlung von char in TCHAR showdir(tPfad, recursive,nummerierung); ++ndirs; } } if(!ndirs) showdir(L".", recursive,nummerierung); return 0; }
Anmerkung
Hier geht es um das NTFS-Attribut „OFFLINE“; NICHT um normale gecachte Offlinedateien.