[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    { Daniel J. Wojcik  Brute Force Programming/The Mindless Entertainment Group
    	wojcik@satcom.kaiserslautern.army.mil & http://147.35.241.5/mindless/bfp.htm

      The other Windows file-copying routines all use blockread/write.  Why?
      Windows comes with a file copying routine in VER.DLL with access through
    	Borland's VER.TPW and it does more than just copy.
    	This is written as a Unit, but no reason in the world not to use VerInstallFile
    	by itself if you set up the parameters correctly in your program.}

    Unit WinCopy;

    interface

    uses Ver, Strings, WinDos;

    FUNCTION WindowsFileCopy(Src, Dest : PChar) : LongInt;

    implementation
    {******************************************************************************
     Function to copy files within Windows.
     It can also rename the file while copying.
     As written, it will copy the file, overwriting an existing file unless the
     existing file is readonly.
     It will also expand the file if it was compressed using COMPRESS.EXE (like a
     normal Windows-type installation, i.e. TWEEDLE.EX_ -> TWEEDLE.EXE)
     The return value can be a number of different things depending on the results
     of the copy.  Check out VerInstallFile in TPW Help for details.
     The VIFF_FORCEINSTALL & VIFF_DONTDELETEOLD can be changed for different
     situations.  Again, check out TPW Help.
     The Functions LZCopy and CopyLZFile do the same things, but use file handles
     instead of file names.  I think this is easier.
     ******************************************************************************}

    FUNCTION WindowsFileCopy(Src, Dest : PChar) : LongInt;
    VAR
      SDir,
    	DDir		: array[0..fsDirectory] of Char; {source & dest dir with drive letter}
    	SName,
    	DName		: array[0..fsFileName] of Char;  {file name without extension}
      SExt,
    	DExt		: array[0..fsExtension] of Char; {extension}
      SFile,
      DFile		: array[0..12] of Char; {name + extension}
    	TmpFile     : array[0..fsPathName] of char;
    	TmpFileLen 	: Word;
    Begin
      FileSplit(Src, SDir, SName, SExt);  {get the parts of the original file}
      FileSplit(Dest, DDir, DName, DExt); {get the parts of the file to copy}
      StrCopy(SFile,SName); {put the name & extension back together}
      StrCat(SFile,SExt);
      StrCopy(DFile,DName); {put the name & extension back together}
      StrCat(DFile,DExt);

    	WindowsFileCopy := VerInstallFile(VIFF_FORCEINSTALL+VIFF_DONTDELETEOLD,
    																		SFile,DFile,SDir,DDir,SDir,TmpFile,TmpFileLen);
    End;

    End.

    { --------------------  demo --------------------------- }

    {Stupid demo program.  Copies its source code to another filename.  Everything
     must be in the same directory to work.  Don't blink.}

    {$A+,B-,D+,F-,G+,I+,K+,L+,N-,P-,Q+,R+,S+,T-,V-,W-,X+,Y+}
    {$M 1024,0}
    program CopyTest;

    uses WinCopy,WinTypes,WinProcs,OWindows,Strings,WinDOS;

    CONST
      cm_Start	= 101;

    TYPE
      CopyTestApp = object(TApplication)
    		PROCEDURE InitMainWindow; virtual;
      End;

    	PCopyWindow = ^CopyWindow;
    	CopyWindow = object(TWindow)
    		CONSTRUCTOR Init(AParent: PWindowsObject; ATitle: PChar);
        PROCEDURE SetupWindow; virtual;
        PROCEDURE CMStart(VAR Msg : TMessage);
        	virtual cm_First + cm_Start;
    	End;

    PROCEDURE CopyWIndow.SetupWindow;
    VAR
    	Mess : TMessage;
    Begin
    	inherited SetupWindow;
      CMStart(Mess);
    End;

    PROCEDURE CopyWindow.CMStart(VAR Msg : TMessage);
    VAR
    	SrcDir,
    	DstDir	: array[0..fsDirectory] of Char;
    	FileName	: array[0..79] of char;
    Begin
    	GetCurDir(SrcDir, 0);
      StrCopy(DstDir,SrcDir);
      WindowsFileCopy(StrCat(SrcDir,'\COPYWIN.PAS'),StrCat(DstDir,'\THECOPY.PAS'));
      MessageBox(0, 'Done', 'Done!', mb_ApplModal or mb_IconExclamation or mb_Ok);
    	PostQuitMessage(0);
    End;

    PROCEDURE CopyTestApp.InitMainWindow;
    Begin
    	MainWindow := New(PCopyWindow,Init(nil,'Windows File Copy'));
    End;

    CONSTRUCTOR CopyWindow.Init(AParent: PWindowsObject; ATitle: PChar);
    Begin
      TWindow.Init(AParent,ATitle);
    End;

    VAR
    	CopyApp : CopyTestApp;

    Begin
      CopyApp.Init('Windows Copy');
      CopyApp.Run;
      CopyApp.Done
    End.

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]