|
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;
}
|
|