diff options
author | Tim Peters <tim.peters@gmail.com> | 2000-10-09 23:43:55 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2000-10-09 23:43:55 (GMT) |
commit | cfc4178e843f5f2b0f190bacd222c0f72ab91e53 (patch) | |
tree | 02fc024fbff8112772407f9ba1b9b7f2ea9ef0a9 | |
parent | e8d2f5589bdbe8988c97b2f8bb265f1aca2b4193 (diff) | |
download | cpython-cfc4178e843f5f2b0f190bacd222c0f72ab91e53.zip cpython-cfc4178e843f5f2b0f190bacd222c0f72ab91e53.tar.gz cpython-cfc4178e843f5f2b0f190bacd222c0f72ab91e53.tar.bz2 |
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.
-rw-r--r-- | Lib/wave.py | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/Lib/wave.py b/Lib/wave.py index 49e070f..e9a1629 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -152,11 +152,15 @@ class Wave_read: raise Error, 'fmt chunk and/or data chunk missing' def __init__(self, f): + self._i_opened_the_file = None if type(f) == type(''): f = __builtin__.open(f, 'rb') + self._i_opened_the_file = f # else, assume it is an open file object already self.initfp(f) + def __del__(self): + self.close() # # User visible methods. # @@ -168,6 +172,9 @@ class Wave_read: self._soundpos = 0 def close(self): + if self._i_opened_the_file: + self._i_opened_the_file.close() + self._i_opened_the_file = None self._file = None def tell(self): @@ -284,8 +291,10 @@ class Wave_write: """ def __init__(self, f): + self._i_opened_the_file = None if type(f) == type(''): f = __builtin__.open(f, 'wb') + self._i_opened_the_file = f self.initfp(f) def initfp(self, file): @@ -300,8 +309,7 @@ class Wave_write: self._datalength = 0 def __del__(self): - if self._file: - self.close() + self.close() # # User visible methods. @@ -413,11 +421,15 @@ class Wave_write: self._patchheader() def close(self): - self._ensure_header_written(0) - if self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + if self._file: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + 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. |