When the classes in wave.py opened files themselves, their .close() methods

didn't bother to close the files.  This caused the new test_wave test to fail
under Windows, as Windows won't let you delete a file that's open.  Fixed
that by ensuring the wave read & write classes' .close() and __del__ methods
close files that were opened by their constructors.
This commit is contained in:
Tim Peters 2000-10-09 23:43:55 +00:00
parent e8d2f5589b
commit cfc4178e84
1 changed files with 19 additions and 7 deletions

View File

@ -152,11 +152,15 @@ class Wave_read:
raise Error, 'fmt chunk and/or data chunk missing' raise Error, 'fmt chunk and/or data chunk missing'
def __init__(self, f): def __init__(self, f):
self._i_opened_the_file = None
if type(f) == type(''): if type(f) == type(''):
f = __builtin__.open(f, 'rb') f = __builtin__.open(f, 'rb')
self._i_opened_the_file = f
# else, assume it is an open file object already # else, assume it is an open file object already
self.initfp(f) self.initfp(f)
def __del__(self):
self.close()
# #
# User visible methods. # User visible methods.
# #
@ -168,6 +172,9 @@ class Wave_read:
self._soundpos = 0 self._soundpos = 0
def close(self): def close(self):
if self._i_opened_the_file:
self._i_opened_the_file.close()
self._i_opened_the_file = None
self._file = None self._file = None
def tell(self): def tell(self):
@ -284,8 +291,10 @@ class Wave_write:
""" """
def __init__(self, f): def __init__(self, f):
self._i_opened_the_file = None
if type(f) == type(''): if type(f) == type(''):
f = __builtin__.open(f, 'wb') f = __builtin__.open(f, 'wb')
self._i_opened_the_file = f
self.initfp(f) self.initfp(f)
def initfp(self, file): def initfp(self, file):
@ -300,8 +309,7 @@ class Wave_write:
self._datalength = 0 self._datalength = 0
def __del__(self): def __del__(self):
if self._file: self.close()
self.close()
# #
# User visible methods. # User visible methods.
@ -413,11 +421,15 @@ class Wave_write:
self._patchheader() self._patchheader()
def close(self): def close(self):
self._ensure_header_written(0) if self._file:
if self._datalength != self._datawritten: self._ensure_header_written(0)
self._patchheader() if self._datalength != self._datawritten:
self._file.flush() self._patchheader()
self._file = None self._file.flush()
self._file = None
if self._i_opened_the_file:
self._i_opened_the_file.close()
self._i_opened_the_file = None
# #
# Internal methods. # Internal methods.