367 lines
8.7 KiB
C++
367 lines
8.7 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990-2001 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
XCopy.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the definition for the XCOPY class, which
|
|||
|
implements the DOS5-compatible XCopy utility.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Ramon Juan San Andres (ramonsa) 01-May-1990
|
|||
|
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#if !defined( _XCOPY_ )
|
|||
|
|
|||
|
#define _XCOPY_
|
|||
|
|
|||
|
#include "object.hxx"
|
|||
|
#include "keyboard.hxx"
|
|||
|
#include "program.hxx"
|
|||
|
|
|||
|
//
|
|||
|
// Forward references
|
|||
|
//
|
|||
|
DECLARE_CLASS( ARRAY );
|
|||
|
DECLARE_CLASS( FSN_DIRECTORY );
|
|||
|
DECLARE_CLASS( FSNODE );
|
|||
|
DECLARE_CLASS( FSN_FILE );
|
|||
|
DECLARE_CLASS( FSN_FILTER );
|
|||
|
DECLARE_CLASS( TIMEINFO );
|
|||
|
DECLARE_CLASS( XCOPY );
|
|||
|
DECLARE_CLASS( ARGUMENT_LEXEMIZER );
|
|||
|
DECLARE_CLASS( STRING_ARRAY );
|
|||
|
DECLARE_CLASS( ITERATOR );
|
|||
|
|
|||
|
class XCOPY : public PROGRAM {
|
|||
|
|
|||
|
public:
|
|||
|
|
|||
|
DECLARE_CONSTRUCTOR( XCOPY );
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
~XCOPY (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Initialize (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
DoCopy (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
DisplayMessageAndExit (
|
|||
|
IN MSGID MsgId,
|
|||
|
IN PWSTRING String,
|
|||
|
IN ULONG ExitCode
|
|||
|
);
|
|||
|
|
|||
|
private:
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
Construct (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
AbortIfCtrlC(
|
|||
|
VOID
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PFSN_DIRECTORY
|
|||
|
MakeDirectory(
|
|||
|
IN PPATH DestinationPath,
|
|||
|
IN PCPATH TemplatePath
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
CheckTargetSpace (
|
|||
|
IN OUT PFSN_FILE File,
|
|||
|
IN PPATH DestinationPath
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
CheckArgumentConsistency (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Copier (
|
|||
|
IN OUT PFSN_FILE File,
|
|||
|
IN PPATH DestinationPath
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
DeallocateThings (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
ExitWithError(
|
|||
|
IN DWORD ErrorCode
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
GetArgumentsCmd(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
GetDirectoryAndFilePattern(
|
|||
|
IN PPATH Path,
|
|||
|
IN BOOLEAN CopyingManyFiles,
|
|||
|
OUT PPATH *OutDirectory,
|
|||
|
OUT PWSTRING *OutFilePattern
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
GetDirectoryAndFilters(
|
|||
|
IN PPATH Path,
|
|||
|
OUT PFSN_DIRECTORY *OutDirectory,
|
|||
|
OUT PFSN_FILTER *FileFilter,
|
|||
|
OUT PFSN_FILTER *DirectoryFilter,
|
|||
|
OUT PBOOLEAN CopyingManyFiles
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
VOID
|
|||
|
InitializeThings (
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOL
|
|||
|
IsCyclicalCopy(
|
|||
|
IN PPATH PathSrc,
|
|||
|
IN PPATH PathTrg
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOL
|
|||
|
IsFileName(
|
|||
|
IN PPATH Path,
|
|||
|
IN BOOLEAN CopyingManyFiles
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PARGUMENT_LEXEMIZER
|
|||
|
ParseArguments(
|
|||
|
IN PWSTRING CmdLine,
|
|||
|
OUT PARRAY ArgArray
|
|||
|
);
|
|||
|
|
|||
|
STATIC
|
|||
|
WINAPI
|
|||
|
ProgressCallBack(
|
|||
|
LARGE_INTEGER TotalFileSize,
|
|||
|
LARGE_INTEGER TotalBytesTransferred,
|
|||
|
LARGE_INTEGER StreamSize,
|
|||
|
LARGE_INTEGER StreamBytesTransferred,
|
|||
|
DWORD dwStreamNumber,
|
|||
|
DWORD dwCallbackReason,
|
|||
|
HANDLE hSourceFile,
|
|||
|
HANDLE hDestinationFile,
|
|||
|
LPVOID lpData OPTIONAL
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
PWSTRING
|
|||
|
QueryMessageString (
|
|||
|
IN MSGID MsgId
|
|||
|
);
|
|||
|
|
|||
|
VOID
|
|||
|
SetArguments(
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
Traverse (
|
|||
|
IN PFSN_DIRECTORY Directory,
|
|||
|
IN OUT PPATH DestinationPath,
|
|||
|
IN PFSN_FILTER FileFilter,
|
|||
|
IN PFSN_FILTER DirectoryFilter,
|
|||
|
IN BOOLEAN CopyDirectoryStreams
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
UpdateTraverse (
|
|||
|
IN PFSN_DIRECTORY Directory,
|
|||
|
IN OUT PPATH DestinationPath,
|
|||
|
IN PFSN_FILTER FileFilter,
|
|||
|
IN PFSN_FILTER DirectoryFilter,
|
|||
|
IN BOOLEAN CopyDirectoryStreams
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
UserConfirmedCopy (
|
|||
|
IN PCWSTRING SourcePath,
|
|||
|
IN PCWSTRING DestinationPath
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
UserConfirmedOverWrite (
|
|||
|
IN PPATH DestinationFile
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
InitializeExclusionList(
|
|||
|
IN PWSTRING ListOfFiles
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
AddToExclusionList(
|
|||
|
IN PWSTRING ExclusionListFileName
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
IsExcluded(
|
|||
|
IN PCPATH Path
|
|||
|
);
|
|||
|
|
|||
|
NONVIRTUAL
|
|||
|
BOOLEAN
|
|||
|
QueryOverWriteSwitch(
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Paths, switches etc. specified in the command line.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// DOS options
|
|||
|
//
|
|||
|
PPATH _SourcePath;
|
|||
|
PPATH _DestinationPath;
|
|||
|
PTIMEINFO _Date;
|
|||
|
BOOLEAN _ArchiveSwitch;
|
|||
|
BOOLEAN _EmptySwitch;
|
|||
|
BOOLEAN _ModifySwitch;
|
|||
|
BOOLEAN _PromptSwitch;
|
|||
|
BOOLEAN _SubdirSwitch;
|
|||
|
BOOLEAN _VerifySwitch;
|
|||
|
BOOLEAN _WaitSwitch;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Windows NT additional options
|
|||
|
//
|
|||
|
BOOLEAN _OverWriteSwitch; // Prompt on overwrite
|
|||
|
BOOLEAN _ContinueSwitch; // Continue if error
|
|||
|
BOOLEAN _CopyIfOldSwitch; // Only newer files
|
|||
|
BOOLEAN _DecryptSwitch; // Destination file un-encrypt
|
|||
|
BOOLEAN _IntelligentSwitch; // Don't ask F or D
|
|||
|
BOOLEAN _HiddenSwitch; // Copy hidden
|
|||
|
BOOLEAN _ReadOnlySwitch; // Overwrite RO
|
|||
|
BOOLEAN _SilentSwitch; // Silent mode
|
|||
|
BOOLEAN _VerboseSwitch; // Verbose mode
|
|||
|
BOOLEAN _DontCopySwitch; // Display only
|
|||
|
BOOLEAN _StructureOnlySwitch; // Structure only
|
|||
|
BOOLEAN _UpdateSwitch; // Apdate existing
|
|||
|
BOOLEAN _CopyAttrSwitch; // Copy attributes
|
|||
|
BOOLEAN _UseShortSwitch; // Use short names
|
|||
|
BOOLEAN _RestartableSwitch; // Copy is restartable
|
|||
|
BOOLEAN _OwnerSwitch; // Copy owner + ACL
|
|||
|
BOOLEAN _AuditSwitch; // Copy SACL
|
|||
|
|
|||
|
//
|
|||
|
// Are we copying to diskette?
|
|||
|
//
|
|||
|
BOOLEAN _DisketteCopy;
|
|||
|
|
|||
|
//
|
|||
|
// Number of files copied.
|
|||
|
//
|
|||
|
ULONG _FilesCopied;
|
|||
|
|
|||
|
//
|
|||
|
// Keyboard
|
|||
|
//
|
|||
|
PKEYBOARD _Keyboard;
|
|||
|
|
|||
|
//
|
|||
|
// Destination file specification. Used to convert source file
|
|||
|
// names to destination file names.
|
|||
|
//
|
|||
|
PWSTRING _FileNamePattern;
|
|||
|
|
|||
|
//
|
|||
|
// Indicates if it is ok to remove empty directories.
|
|||
|
//
|
|||
|
BOOLEAN _CanRemoveEmptyDirectories;
|
|||
|
|
|||
|
//
|
|||
|
// Indicate if the destination is a file, and what the target
|
|||
|
// file name should be.
|
|||
|
//
|
|||
|
BOOLEAN _TargetIsFile;
|
|||
|
PPATH _TargetPath;
|
|||
|
|
|||
|
// File name with the exclusion list.
|
|||
|
//
|
|||
|
PSTRING_ARRAY _ExclusionList;
|
|||
|
PITERATOR _Iterator;
|
|||
|
|
|||
|
BOOLEAN _Cancelled;
|
|||
|
};
|
|||
|
|
|||
|
INLINE
|
|||
|
VOID
|
|||
|
XCOPY::AbortIfCtrlC (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Aborts the program if Ctrl-C was hit.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
if ( _Keyboard->GotABreak() ) {
|
|||
|
exit( EXIT_TERMINATED );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endif // _XCOPY_
|