有时候从编译好的vc目录中复制源代码结构出来收工比较麻烦,学习了下perl,做了一个右键菜单~~
使用要求:
1. 安装perl
2. 修改 复制vc工程目录.reg 中的 bat所在的目录
CopyDir.pl:
#!/usr/bin/perl
require File::Copy;
package CopyDir;
use strict;
if ( @ARGV<2 ){
print @ARGV;
die "Usage: perl srcDir dstDir <filter>\r\n" . "Directory name must use '/' to replace '\\'";
} else {
my $srcDir = @ARGV[0];
my $dstDir = @ARGV[1];
my $regExpFilter = @ARGV[2];
%CopyDir::ignoredExtPattern = (); # 忽略的后缀名
$srcDir =~ s/\\/\//g;
$dstDir =~ s/\\/\//g;
print " srcDir=$srcDir\r\n dstDir=$dstDir\r\n regExpFilter=$regExpFilter\r\n";
if ( $dstDir =~ /^$srcDir/i ) {
# 有可能dstDir的相同的最后一个srcDir字符不是/
if ( $srcDir =~ /\/$/ or $dstDir =~ /"^$srcDir\/"/i ) {
die "ERROR: $srcDir equal or parent of $dstDir\r\n";
}
}
if ( -e $dstDir ){
my $dstDirTmp = $dstDir . "_Backup_" . int(rand(65535));
rename($dstDir, $dstDirTmp) or die "ERROR: rename $dstDir->$dstDirTmp fail!\r\n$!";
print "rename $dstDir -> $dstDirTmp\r\n";
}
mkdir($dstDir) or die "ERROR: make $dstDir fail!\r\n$!";
print "mkdir $dstDir\r\n";
my $copyCount = copyDir($srcDir, $dstDir, 1, $regExpFilter);
my @keysForIgnoredExt = keys %CopyDir::ignoredExtPattern;
my $keysForIgnoredExtCount = @keysForIgnoredExt;
if ( @keysForIgnoredExt ) {
print "Igored extension(s): $keysForIgnoredExtCount\r\n";
for (keys %CopyDir::ignoredExtPattern){
print " $_ ==> $CopyDir::ignoredExtPattern{$_}\r\n";
}
}
print "copied $copyCount file(s).\r\n";
}
sub copyDir{
my $srcDir = shift(@_);
my $dstDir = shift(@_);
my $needCopyDir = shift(@_);
my $regExpFilter = shift(@_);
if ( !(-e $dstDir) ){
if ( !mkdir($dstDir) ){
print "ERROR: mkdir $dstDir fail! $!\r\n";
return 0;
} else {
print "mkdir $dstDir\r\n";
}
} elsif ( !(-d $dstDir) ) {
print "ERROR: $dstDir is not directory!\r\n";
return 0;
}
my $copyCount = 0;
if ( opendir (my $SRCDIRHANDLE, $srcDir) ){
print "enter $srcDir\r\n";
while ( readdir($SRCDIRHANDLE) ){
my $curFile = $_;
if ( $curFile eq "." || $curFile eq ".."){
next;
}
my $srcFileName = "$srcDir/$curFile";
my $dstFileName = "$dstDir/$curFile";
if ( -d $srcFileName ){
if ( $needCopyDir ){
my $curCount = copyDir($srcFileName, $dstFileName, $needCopyDir, $regExpFilter);
if ( $curCount==0 ){
print "==> $dstFileName ... IGNORE\r\n";
rmdir($dstFileName);
}
$copyCount += $curCount;
}
next;
}
elsif ( -f $srcFileName ){
#`copy $srcFileName $dstFileName`;
my $cmdString = "copy $srcFileName --> $dstFileName";
if ( defined($regExpFilter) ){
if ( $curFile !~ /$regExpFilter/i ){
print "--> $dstFileName ... IGNORE\r\n";
$curFile =~ /^(.+)\.(.+)$/;
if ( $2 ){
$CopyDir::ignoredExtPattern{$2} += 1;
}
next;
}
}
if ( !File::Copy::copy($srcFileName, $dstFileName) ) {
print "--> $dstFileName ... FAIL\r\n";
} else {
print "--> $dstFileName ... OK\r\n";
++$copyCount;
}
}
}
closedir($SRCDIRHANDLE);
print "exit $srcDir\r\n";
}
else{
print "ERROR: opendir $srcDir fail! $!\r\n";
return 0;
}
return $copyCount;
}
copyVCDirShell.bat:
@echo off
if '%1'=='' goto PARAMERR
%~d0
cd "%~dp0"
perl CopyDir.pl %1 %1_copyVCDir "\.h$|\.cpp$|\.c$|\.rc$|\.rc2$|\.vcproj$|\.sln$|\.ico$|\.dsp$|\.dsw$|\.bmp$|\.png$"
goto EXIT
:PARAMERR
echo Usage: copyVCDir sourceDir destinationDir
:EXIT
pause
复制vc工程目录.reg:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\CopyVCDir]
@="Copy VC Project Directory"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\CopyVCDir\command]
@="cmd.exe /c \"TITLE Copy VC Project Directory %1 && COLOR 9A && d:\perl\copyVCDirShell.bat \"%1\" \" "