windows-nt/Source/XPSP1/NT/enduser/speech/lib/perl/iit/file.pm
2020-09-26 16:20:57 +08:00

1212 lines
31 KiB
Perl

if (!$__IITPRINTLPM ) { use iit::printl; }
if (!$__IITUTILPM ) { use iit::util; }
use Win32::File;
use File::Copy; #allows use of built in copy() and move() functions
use File::Path; #allows use of built in mkpath() and rmtree() functions
use File::Compare;
use FileHandle; #allows use of activeperl filehandle layer
use Cwd; #allows use of cwd() to get current working directory
use English; #allows use of english names for $(*) variables
####################################################################################
# DelAll()
# deletes all files in a first argument directory name (recursively deletes if argument 2 is non-null)
# report number of files in what directory deleted to screen and log
# returns total number (including recursively) of deleted files
# a-jbilas, 04/10/99 - created
# a-jbilas, 06/11/99 - check if PushD() fails, don't remove directories after delete
# a-jbilas, 07/20/99 - remove directories after deletion, don't delete files or dirs containing slm.ini
####################################################################################
sub DelAll($;$$)
{
my($sDirectory, $bRecurse, $bIgnoreIni) = @_;
my($fileNum) = 0;
if ((-e $sDirectory) && PushD($sDirectory))
{
my($bNoRemove) = 0;
my(@lFiles) = GetFiles();
if ($bIgnoreIni || !IsMemberOf("slm.ini", @lFiles))
{
local(@lDeletedFiles) = ();
foreach $file (@lFiles)
{
if (!unlink($file))
{
PrintL("Could not delete ".$file." ($!)\n", PL_ERROR);
$rc = 0;
}
else
{
push(@lDeletedFiles, $file);
}
}
PrintLTip(" - deleted ".scalar(@lDeletedFiles)." files in ".cwd()."\n", join(", ", @lDeletedFiles), PL_BLUE);
$fileNum += scalar(@lDeletedFiles);
}
else
{
$bNoRemove = 1;
}
if (defined $bRecurse)
{
foreach $dir (GetSubdirs())
{
if (-d cwd()."\\$dir")
{
$fileNum += DelAll(cwd()."\\$dir", 1, $bIgnoreIni); #recurse each directory
}
}
}
PopD(); #$sDirectory
if (!$bNoRemove)
{
if (!rmdir($sDirectory))
{
PrintL("Could not remove directory: ".$sDirectory." (".$!.")\n", PL_ERROR);
}
}
}
return($fileNum);
}
####################################################################################
# DelOld()
# search recursively for directory names matching elements in @lBuilds and call DelOld
# to delete their contents
# a-jbilas, 04/10/99 - created
# a-jbilas, 06/11/99 - check if PushD() fails
####################################################################################
sub DelOld
{
carp("Usage: bool DelOld(directory, listBuildsPtr) ")
unless(@_ == 2);
local($sDirectory, *m_lBuilds) = @_;
my($nDelFiles) = 0;
if ((-d $sDirectory) && PushD($sDirectory))
{
opendir(SRC, $sDirectory); #must be directories as all files are deleted
local(@lDirectories) = grep(!/^\.\.?$/, readdir(SRC)); #(ignore .. .)
foreach $dir (@lDirectories)
{
if ((-d cwd()."\\$dir") && (IsMemberOf($dir, @m_lBuilds)))
{
$nDelFiles += DelAll(cwd()."\\$dir", 1); #recursively delete target and object dirs
}
elsif (-d cwd()."\\$dir")
{
$nDelFiles += DelOld(cwd()."\\$dir", *m_lBuilds); #recursively look for target and object dirs
}
}
PopD(); #$sDirectory
}
closedir($sDirectory);
return($nDelFiles);
}
####################################################################################
# EchoedCopy()
# copy file1 to file2 and echo results to screen and log
# returns 1 for success, 0 for failure
# a-jbilas, 04/10/99 - created
# a-jbilas, 08/04/99 - use wildcards
####################################################################################
sub EchoedCopy($;$)
{
my($sFile1, $sFile2) = @_;
my($rc) = 1;
if ($bVerbose) { PrintL(" - Called EchoedCopy (".$_[0].", ".$_[1].")\n", PL_PURPLE); }
if ($sFile2 eq "") #copy to current directory (no directory or filename given)
{
$sFile2 = cwd();
}
if (IsDirectory($sFile2) && ($sFile1 !~ /(\*|\?)/)) #copy to path (no filename given)
{
$sFile2 .= "\\".RemovePath($sFile1);
}
if ($sFile2 =~ /(\*|\?)/)
{
PrintL("EchoedCopy() Error: destination does not support wildcards\n",
(IsCritical() ? PL_BIGERROR : PL_ERROR) | PL_SETERROR);
return(0);
}
$sFile1 =~ s/\//\\/g;
$sFile2 =~ s/\//\\/g;
if ($sFile1 =~ /(\*|\?)/) # if file contains wildcards
{
if ($sFile1 =~ /\?/)
{
my($tmp) = $sFile1;
$tmp =~ s/\?/ /g;
if (($tmp =~ /\*/) || (-e $tmp))
{
$rc = EchoedCopy($tmp, $sFile2) && $rc;
}
}
foreach $file (glob($sFile1))
{
$rc = EchoedCopy($file, $sFile2) && $rc;
}
}
else
{
PrintL(" - Copying ".$sFile1." --> ".$sFile2."\n", PL_BLUE);
if ($sFile2 =~ /\\/ && !IsDirectory(GetPath($sFile2)))
{
PrintL("EchoedCopy() Warning : Destination directory does not exist, creating ...\n",
(IsCritical() ? PL_BIGWARNING : PL_WARNING) | PL_SETERROR);
EchoedMkdir(GetPath($sFile2));
}
if (!copy($sFile1, $sFile2))
{
$rc = 0;
my($err) = $!;
PrintL("Copy of ".$sFile1." --> ".$sFile2." <b>FAILED</b>",
(IsCritical() ? PL_BIGERROR : PL_ERROR) | PL_SETERROR);
PrintL("\n$err\n\n", PL_RED | PL_BOLD | PL_SETERROR);
if (IsCritical())
{
PrintMsgBlock(split(/\n/, $err));
}
}
}
if (!$rc && IsCritical())
{
$bCopyFailed = 1;
$bcStatus |= BC_COPYFAILED
}
return($rc);
}
####################################################################################
# EchoedCompare()
# compare file1 to file2 and echo results to screen and log
# returns 1 for identical, 0 for differ (or not exist)
# a-jbilas, 08/01/99 - created
# a-jbilas, 09/17/99 - add file diff (third arg non-null to enable)
# a-jbilas, 10/20/99 - if second arg is null, file will be tested for zerolength
####################################################################################
sub EchoedCompare($$;$)
{
my($rc) = 1;
my($f1, $f2) = @_;
my($bRemoteDiff) = ((scalar(@_) == 3) ? 1 : 0);
if ($f1 eq "")
{
PrintL(' - Comparing '.$f2.' against an empty file'."\n", PL_BLUE);
if (!-e $f2)
{
PrintL($f2.' does not exist'."\n", PL_BLUE);
return(1);
}
else
{
$f1 = "null";
if (!-e "null")
{
PrintToFile($f1, "");
}
}
}
if ($f2 eq "")
{
PrintL(' - Comparing '.$f1.' against an empty file'."\n", PL_BLUE);
if (!-e $f1)
{
PrintL($f1.' does not exist'."\n", PL_BLUE);
return(1);
}
else
{
$f2 = "null";
if (!-e "null")
{
PrintToFile($f2, "");
}
}
# swap the files (better for first file to be null)
my($temp) = $f1;
$f1 = $f2;
$f2 = $temp;
}
else
{
PrintL(' - Comparing '.$f1.' against '.$f2."\n", PL_BLUE);
if (!-e $f1)
{
PrintL($f1." does not exist\n", PL_WARNING);
$rc = 0;
}
if (!-e $f2)
{
PrintL($f2." does not exist\n", PL_WARNING);
$rc = 0;
}
}
if ($rc)
{
if (compare($f1, $f2) != 0)
{
$rc = 0;
if ($bRemoteDiff && (($sDropDir && $bOfficialBuild) || (!$bOfficialBuild && ($TEMP ne ""))))
{
my($sDiffDir) = $sDropDir."\\dif";
if (!$bOfficialBuild)
{
$sDiffDir = $TEMP."\\".$PROJ."dif";
}
my($sDiffFile1) = $sDiffDir."\\".time().".".RemovePath($f1);
my($sDiffFile2) = $sDiffDir."\\".(time() + 1).".".RemovePath($f2);
my($sDiffBat) = $sDiffDir."\\".(time() + 2).".ViewDiff.bat";
if (EchoedMkdir($sDiffDir)
&& EchoedCopy($f1, $sDiffFile1)
&& EchoedCopy($f2, $sDiffFile2)
&& PrintToFile($sDiffBat, "start windiff.exe ".$sDiffFile1." ".$sDiffFile2."\n"))
{
PrintL(" - ".$f1." and ".$f2." differ (<a href=\"".TranslateToHTTP($sDiffBat)."\">"
."click and run to view diff<\/a>)\n", PL_BLUE | PL_SETERROR | PL_NOTAG);
}
else
{
PrintL(" - ".$f1." and ".$f2." differ\n", PL_BLUE | PL_SETERROR);
}
}
else
{
PrintL(" - ".$f1." and ".$f2." differ\n", PL_BLUE | PL_SETERROR);
}
}
else
{
PrintL(" - files are identical\n", PL_BLUE);
}
}
return($rc);
}
####################################################################################
# EchoedMkdir()
# make a directory from passed argument and echo results to screen and log
# returns 1 for success, 0 for failure
# a-jbilas, 04/20/99 - created
####################################################################################
sub EchoedMkdir($)
{
my($sPath) = @_;
my($rc) = 1;
if (!-d $sPath)
{
PrintL(" - Creating path ".$sPath."\n", PL_BLUE);
my($sMsg) = "";
eval
{
PrintL("mkdir ".$sPath."\n", PL_VERBOSE);
if ($bWin98)
{
open(FPIN, 'md '.$sPath.' |');
}
else
{
open(FPIN, 'mkdir '.$sPath.' 2>&1 |');
}
while (<FPIN>)
{
PrintL($_);
$sMsg .= "<dd>".$_;
}
close (FPIN);
};
if ($CHILD_ERROR)
{
$rc = 0;
PrintL("Creation of path ".$sPath." <b>FAILED</b>\n",
(IsCritical() ? PL_BIGERROR : PL_ERROR) | PL_SETERROR);
if ($sMsg ne "")
{
PrintMsgBlock(split(/\n/, $sMsg));
}
}
}
else
{
PrintL("EchoedMkdir($sPath): directory already exists\n", PL_VERBOSE);
}
return($rc);
}
####################################################################################
# EchoedUnlink()
# delete multiple or single files passed by string, echo results
# returns 1 on all deletions successful, 0 if any deletions fail
# a-jbilas, 08/01/99 - created
####################################################################################
sub EchoedUnlink
{
my($rc) = 1;
local(@lDeletedFiles) = ();
for ($index = 0 ; $index < scalar(@_) ; ++$index)
{
$! = "";
if ($_[$index] =~ /(\*|\?)/) # if file contains wildcards
{
my($temp) = $_[$index];
$temp =~ s/\//\\/g;
$rc = EchoedUnlink(glob($temp)) && $rc;
}
elsif (!unlink($_[$index]))
{
if ($! eq "No such file or directory")
{
PrintL("Warning: Could not delete ".$_[$index]." ($!)\n", PL_WARNING | PL_VERBOSE);
}
else
{
PrintL("Could not delete ".$_[$index]." ($!)\n", PL_ERROR);
}
$rc = 0;
}
else
{
push(@lDeletedFiles, $_[$index]);
}
}
if (@lDeletedFiles != ())
{
PrintL(" - Deleted ".join(", ", @lDeletedFiles)."\n", PL_BLUE);
}
return($rc);
}
####################################################################################
# EchoedMove()
# rename a file and echo results
# returns 1 on success, 0 on failure
# a-jbilas, 08/01/99 - created
####################################################################################
sub EchoedMove($$)
{
my($rc) = 1;
my($file1, $file2) = @_;
$file1 =~ s/\//\\/g;
$file2 =~ s/\//\\/g;
if (($file1 =~ /(\*|\?)/) || ($file2 =~ /(\*|\?)/)) # if files contain wildcards
{
$rc = Execute("move /Y ".$file1." ".$file2) && $rc; #REVIEW: win9x compatibility?
}
else
{
PrintL(" - Renaming ".$file1." --> ".$file2."\n", PL_BLUE);
if (!-e $file1)
{
my($err) = $!;
if (IsCritical())
{
PrintL("Rename of ".$file1." --> ".$file2." <b>FAILED</b>",
PL_BIGERROR | PL_SETERROR);
PrintMsgBlock($err);
}
else
{
PrintL("Rename of ".$file1." --> ".$file2." <b>FAILED</b>\n$err",
PL_ERROR);
}
$rc = 0;
}
else
{
EchoedUnlink($file2);
if (!move($file1, $file2))
{
my($err) = $!;
if (IsCritical())
{
PrintL("Rename of ".$file1." --> ".$file2." <b>FAILED</b>",
PL_BIGERROR | PL_SETERROR);
PrintMsgBlock($err);
}
else
{
PrintL("Rename of ".$file1." --> ".$file2." <b>FAILED</b>\n$err",
PL_ERROR);
}
$rc = 0;
}
}
}
if (!$rc && IsCritical())
{
$bCopyFailed = 1;
}
return($rc);
}
####################################################################################
# PopD()
# perl version of DOS pushd
# differences:
# will warn user if empty directory stack popped instead of simply doing nothing
# returns 1 on success, 0 on error
# a-jbilas, 03/10/99 - created
####################################################################################
sub PopD
{
$sNewDir = pop(@__sDirStack) || PrintL("Error: Trying to pop an empty directory stack!\n",
PL_BIGERROR | PL_SETERROR); #TODO: break?
# if (($_[0] ne "") && (lc($sNewDir) ne lc($_[0])))
# {
# PrintL("PopD() Warning : dir verification fails (expected: ".$_[0].", actual: ".$sNewDir.")\n", PL_BIGWARNING);
# }
if (!chdir($sNewDir))
{
PrintL("PopD() ERROR : $!\n", PL_BIGERROR);
return 0;
}
PrintL("Popped to $sNewDir\n", PL_VERBOSE);
return 1;
}
####################################################################################
# PushD()
# perl version of DOS pushd
# differences:
# will create directory (and warn user) if pushed directory doesn't exist instead of simply doing nothing
# returns 1 on success, 0 on error
# a-jbilas, 03/10/99 - created
####################################################################################
sub PushD($)
{
carp("Usage: PushD(directory) ")
unless(@_ == 1);
if (!defined @__sDirStack)
{
@__sDirStack = ();
}
my($sNewDir) = @_;
$sCurDir = cwd();
if (!-d $sNewDir)
{
EchoedMkdir($sNewDir);
PrintL("PushD() Warning: creating new directory: ".$sNewDir."\n", PL_BIGWARNING | PL_SETERROR);
}
if (!chdir($sNewDir) && !chdir("$sCurDir\\$sNewDir"))
{
PrintL("PushD() Error: Cannot open directory $sNewDir (".$!.")\n", PL_BIGERROR | PL_SETERROR);
return(0);
}
push(@__sDirStack, $sCurDir);
PrintL("Pushed to $sNewDir\n", PL_VERBOSE);
return(1);
}
####################################################################################
# OpenFile()
# wrapper for filehandle->open
# when passed a filename and a accesstype (read/write/append/full), function will
# return a filehandle associated with the given filename (returns 0 for failure)
# a-jbilas, 03/10/99 - created
####################################################################################
sub OpenFile($$)
{
# TODO: add combined opens
my($__OpenFileFH) = 0;
local($sFileName, $sFileAccessType) = @_;
if ($sFileAccessType =~ /^r(ead)?$/i)
{
$__OpenFileFH = new FileHandle;
if ($__OpenFileFH->open("<".$sFileName))
{
PrintL("$sFileName successfully opened for input\n", PL_VERBOSE);
}
elsif (IsCritical())
{
PrintL("OpenFile() Error: could not open $sFileName for input\n", PL_BIGERROR | PL_SETERROR);
PrintMsgBlock($!);
$__OpenFileFH = 0;
}
else
{
PrintL("OpenFile() Error: could not open $sFileName for input\n", PL_ERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
}
elsif ($sFileAccessType =~ /^w(rite)?$/i)
{
$__OpenFileFH = new FileHandle;
if ($__OpenFileFH->open(">".$sFileName))
{
PrintL("$sFileName successfully opened for output\n", PL_VERBOSE);
}
elsif (IsCritical())
{
PrintL("OpenFile() Error: could not open $sFileName for output\n", PL_BIGERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
else
{
PrintL("OpenFile() Error: could not open $sFileName for output\n", PL_ERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
}
elsif ($sFileAccessType =~ /^a(ppend)?$/i)
{
$__OpenFileFH = new FileHandle;
if ($__OpenFileFH->open(">>".$sFileName))
{
PrintL("$sFileName successfully opened for output (appended)\n", PL_VERBOSE);
}
elsif (IsCritical())
{
PrintL("OpenFile() Error: could not open $sFileName for append\n", PL_BIGERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
else
{
PrintL("OpenFile() Error: could not open $sFileName for append\n", PL_ERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
}
elsif ($sFileAccessType =~ /^f(ull)?$/i)
{
$__OpenFileFH = new FileHandle;
if ($__OpenFileFH->open("+>".$sFileName))
{
PrintL("$sFileName successfully opened for input and output\n", PL_VERBOSE);
}
elsif (IsCritical())
{
PrintL("OpenFile() Error: could not open $sFileName for input and output\n", PL_BIGERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
else
{
PrintL("OpenFile() Error: could not open $sFileName for input and output\n", PL_ERROR | PL_SETERROR);
$__OpenFileFH = 0;
}
}
else
{
$__OpenFileFH = 0;
}
return($__OpenFileFH);
}
####################################################################################
# CloseFile()
# wrapper for $filehandle->close (just closes the file)
# return 1 for success, 0 for failure
# a-jbilas, 03/10/99 - created
####################################################################################
sub CloseFile
{
local($fh) = @_;
$rc = 0;
if ($fh)
{
if($fh->close)
{
PrintL($fh." successully closed\n", PL_VERBOSE);
$rc = 1;
}
else
{
PrintL("CloseFile() Error: could not close filehandle\n", PL_BIGWARNING | PL_SETERROR);
PrintMsgBlock($!);
$rc = 0;
}
}
else
{
PrintL("CloseFile() Error: could not close filehandle\n", PL_BIGWARNING | PL_SETERROR);
PrintMsgBlock($!);
$rc = 0;
}
return($rc);
}
####################################################################################
# Delnode()
# quietly delete a directory and all subdirectories of passed directory name
# dougp, 03/10/99 - created
# a-jbilas, 06/09/99 - calls rmdir instead of delnode (name doesn't make too much
# sense anymore, oh well)
# a-jbilas, 07/21/99 - calls DelAll() instead of rmdir (note that it no longer
# deletes files in directories containing slm.ini)
####################################################################################
sub Delnode($)
{
my ($fname) = $_[0];
if (-d $fname)
{
DelAll($fname, 1);
}
}
####################################################################################
# Append()
# append file1 with file2
# a-jbilas, 03/20/99 - created
# a-jbilas, 06/29/99 - echo event to log
####################################################################################
sub Append($$)
{
local($file1, $file2) = @_;
PrintL(" - Appending $file1 with $file2\n", PL_BLUE);
if (!-e $file1)
{
PrintL(" - Append Warning: $file1 does not exist, just copying file to be appended\n", PL_WARNING);
return(EchoedCopy($file2, $file1));
}
elsif (!-e $file2)
{
PrintL(" - Append Error: $file2 does not exist ($file1 can not be appended)\n", PL_BIGERROR | PL_SETERROR);
return(0);
}
$f1h = OpenFile($file1, "append");
$f2h = OpenFile($file2, "read");
if (!$f1h)
{
my($oldErr) = $ERROR;
PrintL(" - Append Error: $file1 failed to open ($file1 can not be appended)\n", PL_BIGERROR | PL_SETERROR);
PrintMsgBlock($oldErr);
return(0);
}
if (!$f2h)
{
my($oldErr) = $ERROR;
PrintL(" - Append Error: $file2 failed to open ($file1 can not be appended)\n", PL_BIGERROR | PL_SETERROR);
PrintMsgBlock($oldErr);
return(0);
}
@lFile2Buffer = $f2h->getlines();
foreach $i (@lFile2Buffer) { print($f1h $i); }
close($f1h);
close($f2h);
return(1);
}
####################################################################################
# GetFiles()
# When passed a directory, it will return a list of all absolute path filenames contained
# within. Returns an empty list upon failure (either to open dir or find subdirs)
# if no dir passed as argument, will assume current directory and do relative path filenames
# adding a non-null second argument will recurse subdirectories (to recurse current
# directory subdirectories, pass either "" (relative paths) or cwd() (absolute paths)
# as first argument). subdirs .. and . are ignored
# a-jbilas, 07/08/99 - created
# a-jbilas, 07/16/99 - added recurse option
####################################################################################
sub GetFiles
{
my(@lFiles) = ();
my($sRelDir) = (($_[0] eq "") ? "" : $_[0]."\\");
opendir(SRCDIR, (($_[0] eq "") ? cwd() : $_[0]));
foreach $file (readdir(SRCDIR))
{
if (!-d $sRelDir.$file)
{
push(@lFiles, $sRelDir.$file);
}
elsif ((-d $sRelDir.$file) && ($_[1] ne "") && ($file !~ /^\.\.?$/))
{
push(@lFiles, GetFiles($sRelDir.$file, 1));
}
}
closedir(SRCDIR);
if ($bVerbose && (@lFiles == ()) && ($_[1] eq ""))
{
PrintToLogErr("GetFiles() Warning: no files found in ".(($_[0] eq "") ? cwd() : $_[0])."\n");
}
return(@lFiles);
}
####################################################################################
# GetSubdirs()
# When passed a directory, it will return a list of all absolute path subdirs contained
# within. Returns an empty list upon failure (either to open dir or find subdirs)
# if no dir passed as argument, will assume current directory and do relative paths
# adding a non-null second argument will recurse subdirectories (to recurse current
# directory subdirectories, pass either "" for relative paths or cwd() for absolute paths
# as first argument). subdirs .. and . are ignored
# a-jbilas, 07/08/99 - created
# a-jbilas, 07/16/99 - added recurse option
####################################################################################
sub GetSubdirs
{
my(@lDirs) = ();
my($sRelDir) = (($_[0] eq "") ? "" : $_[0]."\\");
opendir(SRCDIR, (($_[0] eq "") ? cwd() : $_[0]));
foreach $dir (readdir(SRCDIR))
{
if ((-d $sRelDir.$dir) && ($dir !~ /^\.\.?$/))
{
push(@lDirs, $sRelDir.$dir);
if ($_[1] ne "")
{
push(@lDirs, GetSubdirs($sRelDir.$dir, 1));
}
}
}
closedir(SRCDIR);
if ($bVerbose && (@lDirs == ()) && ($_[1] eq ""))
{
PrintToLogErr("GetSubdirs() Warning: no subdirs found in ".(($_[0] eq "") ? cwd() : $_[0])."\n");
}
return(@lDirs);
}
#### DougP 7/19/99
#### return full path of a program found on the path.
sub FindOnPath($)
{
my ($strProgram) = $_[0];
foreach $dir (split (';', $ENV{"PATH"}))
{
my $strFullPath = $dir."\\".$strProgram;
if (-e $strFullPath)
{
return($strFullPath);
}
}
PrintL("couldn't find path for ".$strProgram."\n", PL_WARNING);
return(0);
}
####################################################################################
# GlobalReplaceInFile()
# Performs a global string replacement in file specified
# a-jbilas, 07/26/99 - created
####################################################################################
sub GlobalReplaceInFile($$$)
{
# NOTE: entire file buffered in memory, not for use w/ extremely large files
my($sFileName, $sSrc, $sTgt) = @_;
my($buf) = "";
my($acc) = "";
my($bFound) = 0;
my($fhIn) = OpenFile($sFileName, "read");
if (!$fhIn)
{
return(0);
}
else
{
while (!$fhIn->eof())
{
$buf = $fhIn->getline();
if (!$bFound && ($buf =~ /$sSrc/))
{
$bFound = 1;
}
$buf =~ s/$sSrc/$sTgt/g;
$acc .= $buf;
}
CloseFile($fhIn);
if ($bFound)
{
unlink($fhIn);
my($fhOut) = OpenFile($sFileName, "write");
$fhOut->print($acc);
CloseFile($fhOut);
return(1);
}
}
}
# two routines to track disk space
# return the space left on a directory (in Mb)
# DougP 7/6/99
sub SpaceLeft($)
{
my ($strDir) = $_[0];
open (FPIN, "dir /-C $strDir |");
my $iSpace = -1;
while (<FPIN>)
{
if (/(\d+) bytes free/)
{
$iSpace = $1;
}
}
close (FPIN);
$iSpace /= (1 << 20); # convert to Mb
return int $iSpace;
}
# return an html message if disk space available is below the set limit (in Mb)
# warning if below 5 times set limit
# DougP 7/6/99
sub SpaceLeftAlarm($$)
{
my ($strDir, $iAlarmLevel) = @_;
my $iSpaceLeft = SpaceLeft $strDir;
print "Space left on $strDir is ${iSpaceLeft}M\n";
if ($iSpaceLeft < $iAlarmLevel)
{
return "<strong><font color=red>Space left on $strDir is ${iSpaceLeft}M</font></strong><br>\n";
}
if ($iSpaceLeft < 5*$iAlarmLevel)
{
return "<font color=orange>Space left on $strDir is ${iSpaceLeft}M</font><br>\n";
}
return "";
}
sub GetDLLVersion($)
{
local($_Execute) = 1;
my($version) = "";
if (Execute($cmdShowVer." $_[0]"))
{
$_Execute =~ s/.*Version: \"([^\"]*)\".*\n.*/$1/;
$version = $_Execute;
}
undef $_Execute;
return($version);
}
sub IsDLLVersionHigher($$)
{
my($rc) = 0;
local(@file1ver) = split(/\./, GetDLLVersion($_[0]));
local(@file2ver) = split(/\./, GetDLLVersion($_[1]));
if (@file1ver != 4)
{
PrintL("WARNING: ".$_[0]." DLL does not contain version info, cannot get latest DLL\n",
PL_BIGWARNING | PL_SETERROR);
}
elsif (@file2ver != 4)
{
PrintL("WARNING: ".$_[1]." DLL does not contain version info, cannot get latest DLL\n",
PL_BIGWARNING | PL_SETERROR);
}
else
{
my($latestFound) = 0;
for ($index = 0 ; !$latestFound && ($index < 4) ; ++$index)
{
if ($file1ver[$index] > $file2ver[$index])
{
++$latestFound;
$rc = 1;
}
elsif ($file1ver[$index] < $file2ver[$index])
{
++$latestFound;
}
}
}
return($rc);
}
sub GetLatestDLL($$)
{
if (IsDLLVersionHigher($_[1], $_[0]))
{
return($_[1]);
}
elsif (IsDLLVersionHigher($_[0], $_[1]))
{
return($_[0]);
}
else
{
return("");
}
}
sub IsDirectory($)
{
local($rc) = 0;
if (Win32::File::GetAttributes($_[0], $rc))
{
return($rc & DIRECTORY);
}
else
{
return(0);
}
}
sub IsReadOnly($)
{
local($rc) = 0;
if (Win32::File::GetAttributes($_[0], $rc))
{
return($rc & READONLY);
}
else
{
return(0);
}
}
sub SetReadOnly($$)
{
local($attr) = 0;
if (Win32::File::GetAttributes($_[0], $attr))
{
if ($_[1] && !($attr & READONLY))
{
PrintL(" - Adding read only flag to ".$_[0]."\n", PL_BLUE);
$attr = $attr | READONLY;
return(Win32::File::SetAttributes($_[0], $attr));
}
elsif (!$_[1] && ($attr & READONLY))
{
PrintL(" - Removing read only flag from ".$_[0]."\n", PL_BLUE);
$attr = $attr - READONLY;
return(Win32::File::SetAttributes($_[0], $attr));
}
else
{
return(1);
}
}
else
{
return(0);
}
}
sub PrintToFile
{
my($fileName) = $_[0];
shift(@_);
my($rc) = 1;
my($fhOut) = OpenFile($fileName, "append");
if ($fhOut)
{
foreach $elem (@_)
{
$fhOut->print($elem);
}
CloseFile($fhOut);
}
else
{
$rc = 0;
}
return($rc);
}
sub GetAllTextFromFile($)
{
my($fileName) = $_[0];
my($data) = "";
my($fhIn) = OpenFile($fileName, "read");
if ($fhIn)
{
while (!$fhIn->eof())
{
$data .= $fhIn->getline();
}
CloseFile($fhIn);
}
return($data);
}
# given a remote UNC filename, will return the network server name
# (if given a local filename, will return the local computer name)
sub GetServerName($)
{
my($file) = $_[0];
if ($file !~ /^\\\\/)
{
return(uc($COMPUTERNAME));
}
$file =~ s/^\\\\([^\\]+).*/$1/;
return(uc($file));
}
sub KillOpenFiles
{
my($sServer) = $_[0];
shift(@_);
local(@lFiles) = @_;
local($_Execute) = 1;
Execute($cmdKillOpen." \\\\".$sServer);
my(@lOpenFiles) = ();
my($bFilesReached) = 0;
foreach $line (split("\n", $_Execute))
{
if ($bFilesReached)
{
push(@lOpenFiles, join(" ", split(/ +/, $line)));
}
elsif ($line =~ /ID User Name File Name/)
{
$bFilesReached = 1;
}
}
undef($_Execute);
foreach $openfile (@lOpenFiles)
{
my($id, $user, $file) = split(" ", $openfile);
print($id." : ".$user." : ".$file."\n");
}
}
$__IITFILEPM = 1;
1;