|
Compares the contents of two files with an optional message digest.
Syntax
object.CompareFile( File1, [File2], [Options], [Digest] )
Parameters
- File1
- A string which specifies the name of the first file to compare.
This parameter must specify the name of a file which exists and can
be opened for read access by the current process. If the file name
specifies a directory or device name, the method will fail. It is
permitted to use environment variables in the file name by
surrounding the variable name with the percent symbol. If the file
name contains any leading or trailing space characters after the
variable expansion, they will be removed. This parameter cannot be a
zero-length string.
- File2
- An optional string which specifies the name
of the second file to compare. If this parameter is omitted or a
zero-length string, the Digest parameter must specify a
valid message digest and the contents of the first file will be
compared against that digest. If this parameter specifies a file
name, the file must exist and the current process must be able to
open it for read access. If the file name specifies a directory or
device name, the method will fail. It is permitted to use environment
variables in the file name by surrounding the variable name with
the percent symbol. If the file name contains any leading or trailing
space characters after the variable expansion, they will be removed.
- Options
- An integer value which specifies one or more option flags which
will control how the files are compared. This parameter is
constructed by using a bitwise operator with any of the following
values:
Value |
Constant |
Description |
0 |
fileCompareDefault |
Use the default comparison option, which is to perform a
byte comparison of both files. If the Digest
parameter is omitted or a zero-length string, the method will
compare the message digest against the contents of the file. If
the Digest parameter is included and no specific hash
algorithm has been specified as one of the options, the hash
type will be automatically determined based on its value. |
1 |
fileCompareContents |
Perform a byte comparison of the two files. This option
requires both files be specified. The current process must be
able to open both files for exclusive read access. If either
file is opened for write access, the method will fail. The
File2 parameter must specify a valid file name if
this option is used. |
2 |
fileCompareCreated |
Compare the file creation times for both files and only
consider them to be identical if the creation times are
identical. If this option is specified and the creation times
are different, the method will return an error even if the
contents of the two files are identical. The File2
parameter must specify a valid file name if this option is used. |
4 |
fileCompareModified |
Compare the file modification times for both files and only
consider them to be identical if the modification times are identical.
If this option is specified and the modification times are different,
the method will return an error even if the contents of the two
files are identical. The File2 parameter must specify
a valid file name if this option is used. |
&H100 |
fileCompareMD5 |
Use the MD5 algorithm to compute 128-bit hash value for the
contents of the first file and compare this against the specified
digest string. This algorithm is the most efficient method to compute
a hash to verify data integrity, however it is not considered
cryptographically secure and hash collision is possible. When this
option is used the Digest parameter must specify a
valid MD5 hash as a 32 digit hexadecimal string. |
&H200 |
fileCompareSHA1 |
Use the SHA-1 algorithm to compute 160-bit hash value for the
contents of the first file and compare this against the specified
digest string. This algorithm is comparable to the MD5 algorithm and
has a lower chance of hash collision; however, it is not considered
cryptographically secure and hash collision is possible. When this
option is used the Digest parameter must specify a valid
SHA-1 hash as a 40 digit hexadecimal string. |
&H400 |
fileCompareSHA256 |
Use the SHA-256 algorithm to compute a 256-bit hash value
for the contents of the first file and compare this against the
specified digest string. This is a cryptographically secure
algorithm which is more compute intensive than either MD5 or
SHA-1, but the chance of a hash collision is extremely low and
typically not a concern for most applications. When this option
is used the Digest parameter must specify a valid
SHA-256 hash as a 64 digit hexadecimal string. |
- Digest
- An optional string which specifies a sequence of hexadecimal
numbers which are used to compare against the computed hash value
for the file. If this parameter is used and
no option is specified to indicate the hash type, it will be
inferred from the length of the string. If this parameter is omitted or
a zero-length string, it will be ignored. The case of the
hexadecimal digits in the string are ignored and it is permitted,
but not required, to prefix the string with either "0x"
or "&H" to indicate it is a hexadecimal value. If the
string does not specify a valid hexadecimal number or is not a value
computed using one of the supported hash algorithms, the method
will fail.
Return Value
A return value of zero indicates there were no errors and the files
are identical using the specified criteria. A non-zero return value
specifies an error code which indicates the reason for the failure.
Remarks
The CompareFile method can be used to either compare the
contents of two files or compare the contents of a file against a
pre-computed hash value to determine if they match. In addition to
comparing file contents, the method can also check the
file creation and/or modification times to ensure they are the same.
In most cases, an application will specify either two files to
compare or a message digest value. If you call the method using
two file names and a message digest, the contents of both files
must be identical and the computed hash value must match the specified
message digest. If any of the requirements are are not satisfied, the
method will return an error code. For example, if the actual contents
of the two files are identical, but the value specified by the Digest
parameter does not match the computed hash value of files, the
method will still fail.
This method performs the file comparison in a way to minimize
potential disk I/O whenever possible. First, the size of the two files
are compared and if they are different, no further checks are performed.
Next, if either the fileCompareCreated or fileCompareModified
options have been specified, the file timestamps are compared and no
further checks are performed if they do not match. A byte comparison of
both files will only be performed after the other comparison criteria
has been satisfied.
Comparing the contents of a file against a message digest value is
the most expensive operation in terms of memory and processor
utilization. The larger the files are, and the more complex the hash
algorithm, the more compute-intensive the operation will be. In most
cases, the SHA-1 algorithm provides a good balance between resource
utilization and minimizing the possibility of hash collisions where
different files could potentially generate the same hash value.
If it is critically important to minimize the possibility of a hash
collision, use the SHA-256 algorithm; however, be aware of the impact
it can have on performance when used with very large files. The
current thread will block while the hash is being computed and if a
large amount of data is being processed, this may cause the
application to become non-responsive.
This method will normalize the file names provided by the caller
and perform checks to make sure the names do not contain illegal
characters. If the name includes quotes, wildcard characters or other
invalid symbols the method will fail and return stErrorInvalidFileName.
It is permitted to use forward slashes in path names and these will be
converted to the standard backslash character used with Windows paths.
This method cannot be used to compare the contents of NTFS alternate
data streams.
Example
' Compare the contents of a file against an SHA-1 hash value
Dim strFileName As String
Dim strDigest String
Dim nError As Long
strFileName = "%USERPOFILE%\\Documents\\Projects\\MyDocument.docx"
strDigest = "541E43FDC612E41C02B770A2FD87EBB4A12EA800" ' SHA-1 hash value
nError = FileEncoder1.CompareFile(strFileName, , fileCompareSHA1, strDigest)
If nError = 0 Then
MsgBox "The file contents match the SHA-1 digest", vbInformation
Else
MsgBox "The file contents do not match the SHA-1 digest", vbExclamation
End If
' Compare the contents of two files using the default options
Dim strFile1 As String
Dim strFile2 As String
Dim nError As Long
strFile1 = "%USERPROFILE%\\AppName\\ProjectData.db"
strFile2 = "%TEMP%\\BackupData.db"
nError = FileEncoder1.CompareFile(strFile1, strFile2)
If nError = 0 Then
MsgBox "The two files are identical", vbInformation
Else
MsgBox "The two files are different", vbExclamation
End If
See Also
CompressFile Method,
DecodeFile Method,
EncodeFile Method,
ExpandFile Method
|
|