NTFS-Offlinedateien anzeigen

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.

getofflinefiles.c
/*  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.