You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
2.8 KiB
145 lines
2.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
#include "stdafx.h" |
|
#include <string> |
|
#include <ctype.h> |
|
#include <wchar.h> |
|
#include <assert.h> |
|
#include <direct.h> |
|
#include <time.h> |
|
#include <sys/types.h> |
|
#include <sys/stat.h> |
|
|
|
using namespace std; |
|
|
|
void rmkdir( const char *pszPath ) |
|
{ |
|
char *pszScan = const_cast<char*>(pszPath); |
|
|
|
if ( *pszScan == '\\' && *(pszScan + 1) == '\\' ) |
|
{ |
|
assert( 0 ); |
|
} |
|
else if ( *pszScan && *(pszScan + 1) == ':' && *(pszScan + 2) == '\\' ) |
|
{ |
|
pszScan += 3; |
|
} |
|
|
|
char *pszLimit = pszScan + strlen( pszScan ) + 1; |
|
|
|
while ( pszScan < pszLimit ) |
|
{ |
|
if ( *pszScan == '\\' || *pszScan == 0 ) |
|
{ |
|
char temp = *pszScan; |
|
*pszScan = 0; |
|
_mkdir( pszPath ); |
|
*pszScan = temp; |
|
} |
|
pszScan++; |
|
} |
|
} |
|
|
|
|
|
int main(int argc, char* argv[]) |
|
{ |
|
char input[1024*16]; |
|
|
|
string notCopied; |
|
|
|
if ( argc != 3 ) |
|
{ |
|
printf( "wrong arguments\n"); |
|
return 1; |
|
} |
|
|
|
string sourceRoot(argv[1]); |
|
string workingFolder(argv[2]); |
|
|
|
if ( !workingFolder.length() ) |
|
return 1; |
|
|
|
if ( workingFolder[workingFolder.length()] != '\\' ) |
|
workingFolder += "\\"; |
|
|
|
if ( !sourceRoot.length() ) |
|
return 1; |
|
|
|
if ( sourceRoot[sourceRoot.length()] != '\\' ) |
|
sourceRoot += "\\"; |
|
|
|
int lenRoot = sourceRoot.length(); |
|
|
|
int count = 0; |
|
unsigned nKBytesCopied = 0; |
|
time_t startTime = time(NULL); |
|
|
|
while ( gets(input) ) |
|
{ |
|
char *pszName = strstr(input, argv[1] ); |
|
if ( !pszName ) |
|
continue; |
|
|
|
if ( strlen(pszName) - lenRoot <= 0 ) |
|
continue; |
|
|
|
string dest = workingFolder + ( pszName + lenRoot ); |
|
string destDir = dest; |
|
|
|
destDir.erase( destDir.rfind( '\\' ) ); |
|
rmkdir( destDir.c_str() ); |
|
|
|
DWORD attributes = GetFileAttributes( dest.c_str() ); |
|
if ( attributes != -1 && !(attributes & FILE_ATTRIBUTE_READONLY) ) |
|
{ |
|
notCopied += '\n'; |
|
notCopied += dest; |
|
} |
|
else |
|
{ |
|
if ( attributes != -1 ) |
|
SetFileAttributes( dest.c_str(), (attributes & ~FILE_ATTRIBUTE_READONLY ) ); |
|
|
|
printf("%s\n", dest.c_str() ); |
|
fflush(NULL); |
|
if ( !CopyFile( pszName, dest.c_str(), false ) ) |
|
{ |
|
printf( " Failed to copy %s!\n", dest.c_str() ); |
|
} |
|
else |
|
{ |
|
struct _stat fileStat; |
|
_stat( dest.c_str(), &fileStat ); |
|
nKBytesCopied += fileStat.st_size / 1024; |
|
} |
|
|
|
attributes = GetFileAttributes( dest.c_str() ); |
|
SetFileAttributes( dest.c_str(), (attributes | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_ARCHIVE) ); |
|
count++; |
|
} |
|
} |
|
|
|
printf("\n"); |
|
if ( count ) |
|
{ |
|
printf( "%d files copied\n", count ); |
|
printf( "%dk copied\n", nKBytesCopied ); |
|
} |
|
|
|
if ( notCopied.length() ) |
|
{ |
|
printf( "** The following files were not copied because they are writable **\n" ); |
|
printf( notCopied.c_str() ); |
|
printf( "\n" ); |
|
} |
|
|
|
printf("%d seconds\n", time(NULL) - startTime); |
|
|
|
return 0; |
|
} |
|
|
|
|