240 lines
6.2 KiB
C
240 lines
6.2 KiB
C
/*
|
|
* Utility program to munge a set of files, translating names from
|
|
* one form to another. Usage:
|
|
*
|
|
* munge scriptFile files...
|
|
*
|
|
* where the first parameter is the name of a file that consists of
|
|
* one or more lines of the following format:
|
|
*
|
|
* oldName newName
|
|
*
|
|
* and the remaining parameters are the names of the files to munge.
|
|
* Each file is _read into memory, scanned once, where each occurence
|
|
* of an oldName string is replaced by its corresponding newName.
|
|
* If any changes are made to a file, the old version is RMed and
|
|
* the new version written out under the same name.
|
|
*
|
|
*/
|
|
|
|
#include "munge.h"
|
|
|
|
int fQuery = FALSE;
|
|
int fRecurse = FALSE;
|
|
int fVerbose = FALSE;
|
|
|
|
void
|
|
DoFiles(
|
|
char *p,
|
|
struct findType *b,
|
|
void *Args
|
|
);
|
|
|
|
void
|
|
DoFile( p )
|
|
char *p;
|
|
{
|
|
HANDLE FileHandle;
|
|
SYSTEMTIME SystemTime;
|
|
FILETIME CurrentTime;
|
|
FILETIME CreationTime;
|
|
FILETIME LastAccessTime;
|
|
FILETIME LastWriteTime;
|
|
BOOL DatesBogus = FALSE;
|
|
|
|
if (fVerbose)
|
|
fprintf( stderr, "Checking %s\n", p );
|
|
|
|
FileHandle = CreateFile( p,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL
|
|
);
|
|
if (FileHandle == NULL) {
|
|
fprintf( stderr, "%s - unable to open (%d)\n", p, GetLastError() );
|
|
return;
|
|
}
|
|
|
|
if (!GetFileTime( FileHandle,
|
|
&CreationTime,
|
|
&LastAccessTime,
|
|
&LastWriteTime
|
|
)
|
|
) {
|
|
fprintf( stderr, "%s - unable to read file dates (%d)\n", p, GetLastError() );
|
|
CloseHandle( FileHandle );
|
|
return;
|
|
}
|
|
CloseHandle( FileHandle );
|
|
|
|
GetSystemTime( &SystemTime );
|
|
SystemTimeToFileTime( &SystemTime, &CurrentTime );
|
|
|
|
if (CompareFileTime( &CreationTime, &CurrentTime ) > 0) {
|
|
CreationTime = CurrentTime;
|
|
DatesBogus = TRUE;
|
|
}
|
|
|
|
if (CompareFileTime( &LastAccessTime, &CurrentTime ) > 0) {
|
|
LastAccessTime = CurrentTime;
|
|
DatesBogus = TRUE;
|
|
}
|
|
|
|
if (CompareFileTime( &LastWriteTime, &CurrentTime ) > 0) {
|
|
LastWriteTime = CurrentTime;
|
|
DatesBogus = TRUE;
|
|
}
|
|
|
|
if (DatesBogus) {
|
|
printf( "%s dates invalid", p );
|
|
if (fQuery) {
|
|
printf( "\n" );
|
|
return;
|
|
}
|
|
|
|
FileHandle = CreateFile( p,
|
|
GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
0,
|
|
NULL
|
|
);
|
|
if (FileHandle == NULL) {
|
|
printf( " - unable to open for write (%d)\n", GetLastError() );
|
|
}
|
|
else {
|
|
if (!SetFileTime( FileHandle,
|
|
&CreationTime,
|
|
&LastAccessTime,
|
|
&LastWriteTime
|
|
)
|
|
) {
|
|
printf( " - unable to modify file dates (%d)\n", GetLastError() );
|
|
}
|
|
else {
|
|
printf( " - reset to current date/time\n" );
|
|
}
|
|
|
|
CloseHandle( FileHandle );
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
void
|
|
DoFiles(
|
|
char *p,
|
|
struct findType *b,
|
|
void *Args
|
|
)
|
|
{
|
|
if (strcmp (b->fbuf.cFileName, ".") &&
|
|
strcmp (b->fbuf.cFileName, "..") &&
|
|
_stricmp (b->fbuf.cFileName, "slm.dif")
|
|
) {
|
|
if (HASATTR(b->fbuf.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY)) {
|
|
switch (p[strlen(p)-1]) {
|
|
case '/':
|
|
case '\\': strcat (p, "*.*"); break;
|
|
default: strcat (p, "\\*.*");
|
|
}
|
|
|
|
if (fRecurse) {
|
|
fprintf( stderr, "Scanning %s\n", p );
|
|
forfile( p,
|
|
FILE_ATTRIBUTE_DIRECTORY,
|
|
DoFiles,
|
|
NULL
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
DoFile( p );
|
|
}
|
|
}
|
|
|
|
Args;
|
|
}
|
|
|
|
void
|
|
Usage( void )
|
|
{
|
|
fprintf( stderr, "usage: datefix [-q] [-r] [-v] [DirectorySpec(s)]\n" );
|
|
fprintf( stderr, "Where...\n");
|
|
fprintf( stderr, "\t-q\tQuery only - don't actually make changes.\n");
|
|
fprintf( stderr, "\t-r\tRecurse.\n");
|
|
fprintf( stderr, "\t-v\tVerbose - show files being checked.\n");
|
|
fprintf( stderr, "\tDirectorySpec - one or more directories to examime.\n" );
|
|
exit( 1 );
|
|
}
|
|
|
|
int
|
|
__cdecl main( argc, argv )
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
int i;
|
|
char *s, pathBuf[ 64 ];
|
|
int FileArgsSeen = 0;
|
|
|
|
if (argc < 2) {
|
|
Usage();
|
|
}
|
|
|
|
fQuery = FALSE;
|
|
fRecurse = FALSE;
|
|
fVerbose = FALSE;
|
|
|
|
for (i=1; i<argc; i++) {
|
|
s = argv[ i ];
|
|
if (*s == '-' || *s == '/') {
|
|
while (*++s) {
|
|
switch( tolower( *s ) ) {
|
|
case 'q': fQuery = TRUE; break;
|
|
case 'r': fRecurse = TRUE; break;
|
|
case 'v': fVerbose = TRUE; break;
|
|
default: Usage();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
FileArgsSeen++;
|
|
if (GetFileAttributes( s ) & FILE_ATTRIBUTE_DIRECTORY) {
|
|
s = strcpy( pathBuf, s );
|
|
switch (s[strlen(s)-1]) {
|
|
case '/':
|
|
case '\\': strcat (s, "*.*"); break;
|
|
default: strcat (s, "\\*.*");
|
|
}
|
|
fprintf( stderr, "Scanning %s\n", s );
|
|
forfile( s,
|
|
FILE_ATTRIBUTE_DIRECTORY,
|
|
DoFiles,
|
|
NULL
|
|
);
|
|
}
|
|
else {
|
|
DoFile( s );
|
|
}
|
|
}
|
|
}
|
|
|
|
if (FileArgsSeen == 0) {
|
|
s = "*.*";
|
|
fprintf( stderr, "Scanning .\\%s\n", s );
|
|
forfile( s,
|
|
FILE_ATTRIBUTE_DIRECTORY,
|
|
DoFiles,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
return( 0 );
|
|
}
|