From 7bb11d68bf12010a9a6d5074cc0f05e46d1cf517 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 16 Jun 1999 12:25:34 +0000 Subject: Sjoerd Mullender: Added support for unseekable files. (I use unqualified excepts since we don't know why the seek/tell might fail. In my case it was because of an AttributeError.) --- Lib/chunk.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/Lib/chunk.py b/Lib/chunk.py index 320339e..4105f31 100644 --- a/Lib/chunk.py +++ b/Lib/chunk.py @@ -63,7 +63,12 @@ class Chunk: raise EOFError self.chunksize = self.chunksize - 8 # subtract header self.size_read = 0 - self.offset = self.file.tell() + try: + self.offset = self.file.tell() + except: + self.seekable = 0 + else: + self.seekable = 1 def getname(self): """Return the name (ID) of the current chunk.""" @@ -87,6 +92,8 @@ class Chunk: if self.closed: raise ValueError, "I/O operation on closed file" + if not self.seekable: + raise IOError, "cannot seek" if mode == 1: pos = pos + self.size_read elif mode == 2: @@ -133,11 +140,20 @@ class Chunk: if self.closed: raise ValueError, "I/O operation on closed file" - try: - self.file.seek(self.chunksize - self.size_read, 1) - except RuntimeError: - while self.size_read < self.chunksize: - dummy = self.read(8192) - if not dummy: - raise EOFError + if self.seekable: + try: + n = self.chunksize - self.size_read + # maybe fix alignment + if self.align and (self.chunksize & 1): + n = n + 1 + self.file.seek(n, 1) + self.size_read = self.size_read + n + return + except: + pass + while self.size_read < self.chunksize: + n = min(8192, self.chunksize - self.size_read) + dummy = self.read(n) + if not dummy: + raise EOFError -- cgit v0.12