Delete all Files that Path are longer than 255

Da der Explorer und der del-Befehl keine Dateien länger als 255 Zeichen verwalten können, hier ein kleiner Code um dies nachträglich zu ermöglichen.

dellongPathFile.c
/*  Lösche alle Dateien mit Pfad länger als 255!
**  delLongPathFile.exe -r -n H:\ 
**  siehe auch http://en.literateprograms.org/Directory_listing_%28C,_Windows%29
*/
#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 samba
//------------------------------------------------------------------------------
int     showdir(WCHAR *path, BOOL recursive, BOOL loeschen);
int     fixpath(WCHAR *inpath, WCHAR *outpath);
//------------------------------------------------------------------------------
// showdir()
//------------------------------------------------------------------------------
int showdir(TCHAR *_path,BOOL recursive,BOOL loeschen)
{
  HANDLE fh;
 
  int    filecnt=0;
  int    length;
  int    ret=0;
  TCHAR	 path[LINUX_PATH];
  TCHAR	 tmppath[LINUX_PATH];
  TCHAR	 pathlength[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,loeschen);}
        }
      }
      else
      {
       length = wsprintf(pathlength,L "%s%s",_path,fd->cFileName); //Pfadlänge ermitteln
       if  (length > 255){
        if(loeschen)
          {wprintf(L "loesche %d %s%s\n",length,_path,fd->cFileName) && i++;
          ret = DeleteFile(pathlength);
          wprintf(L "ret: %d\n",ret);
          } 
        else  
          {wprintf(L "%d %s%s\n",length,_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 loeschen=0; 
  TCHAR tPfad[LINUX_PATH];
 
  printf("Programm zum Löschen von Dateien mit langen Pfaden : %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 /l oder -l \t Dateien und Verzeichnisse löschen !!!\n");
    printf("Schalter /r oder -r \t Anzeige rekursiv auch der Unterverzeichnisse\n");
    printf("Beispiel : %s -l -r h:\\meineDateien\\\n",argv[0]);
    printf("  oder   : %s -l -r \\\\meinUNCServer\\meineDateien\\\n",argv[0]);
    printf("Ausgabe: lfdNr. Pfadlänge LangerPfad\\datei.ext");
    return 1;
    }
 
  while(*++argv)
  {
    if(!strcmp(*argv,"-r") || !strcmp(*argv,"/r"))
      recursive=1;
    if(!strcmp(*argv,"-l") || !strcmp(*argv,"/l"))
      loeschen=1;
    else
    {
      MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,*argv,-1,tPfad,LINUX_PATH); //Umwandlung von char in TCHAR
      showdir(tPfad, recursive,loeschen);
      ++ndirs;
    }
  }
  if(!ndirs) showdir(L".", recursive,loeschen);
 
  return 0;
}