diff options
| author | Guido van Rossum <guido@python.org> | 1999-10-26 14:02:01 (GMT) | 
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1999-10-26 14:02:01 (GMT) | 
| commit | 2d72687006cda4d5fd8547790b581ad28528eb1a (patch) | |
| tree | 75f2fba206d8d85836fac800b091b2865604ea14 /Lib/filecmp.py | |
| parent | 4e20de59dd5a9058c0d99c10d773b9d0bcbbe07d (diff) | |
| download | cpython-2d72687006cda4d5fd8547790b581ad28528eb1a.zip cpython-2d72687006cda4d5fd8547790b581ad28528eb1a.tar.gz cpython-2d72687006cda4d5fd8547790b581ad28528eb1a.tar.bz2  | |
New module by Moshe Zadka (submitted on Sept. 25).  This unifies the
functionality of cmp.py and cmpcache.py, which are hereby declared
obsolescent.
Diffstat (limited to 'Lib/filecmp.py')
| -rw-r--r-- | Lib/filecmp.py | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/Lib/filecmp.py b/Lib/filecmp.py new file mode 100644 index 0000000..e1a30bc --- /dev/null +++ b/Lib/filecmp.py @@ -0,0 +1,57 @@ +"""Compare files.""" + +import os, stat, statcache + +_cache = {} +BUFSIZE=8*1024 + +def cmp(f1, f2, shallow=1,use_statcache=0):  +	"""Compare two files. + +	Arguments: + +	f1 -- First file name + +	f2 -- Second file name + +	shallow -- Just check stat signature (do not read the files). +	           defaults to 1. + +	use_statcache -- Do not stat() each file directly: go through +	                 the statcache module for more efficiency. + +	Return value: + +	integer -- 1 if the files are the same, 0 otherwise. + +	This function uses a cache for past comparisons and the results, +	with a cache invalidation mechanism relying on stale signatures. +	Of course, if 'use_statcache' is true, this mechanism is defeated, +	and the cache will never grow stale. + +	""" +	stat_function = (os.stat, statcache.stat)[use_statcache] +	s1, s2 = _sig(stat_function(f1)), _sig(stat_function(f2)) +	if s1[0]!=stat.S_IFREG or s2[0]!=stat.S_IFREG: return 0 +	if shallow and s1 == s2: return 1 +	if s1[1]!=s2[1]:         return 0 + +	result = _cache.get((f1, f2)) +	if result and (s1, s2)==result[:2]: +		return result[2] +	outcome = _do_cmp(f1, f2) +	_cache[f1, f2] = s1, s2, outcome +	return outcome + +def _sig(st): +	return (stat.S_IFMT(st[stat.ST_MODE]),  +	        st[stat.ST_SIZE],  +	        st[stat.ST_MTIME]) + +def _do_cmp(f1, f2): +	bufsize = BUFSIZE +	fp1 , fp2 = open(f1, 'rb'), open(f2, 'rb') +	while 1: +		b1, b2 = fp1.read(bufsize), fp2.read(bufsize) +		if b1!=b2: return 0 +		if not b1: return 1  | 
