Author: guido.van.rossum
Date: Fri Oct 26 01:21:03 2007
New Revision: 58658
Modified:
python/branches/py3k/Lib/io.py
python/branches/py3k/Lib/test/test_file.py
Log:
Patch # 1323 by Amaury Forgeot d'Arc.
This patch corrects a problem in test_file.py on Windows:
f.truncate() seeks to the truncation point, but does not empty the
buffers. In the test, f.tell() returns -1...
Modified: python/branches/py3k/Lib/io.py
==============================================================================
--- python/branches/py3k/Lib/io.py (original)
+++ python/branches/py3k/Lib/io.py Fri Oct 26 01:21:03 2007
@@ -597,9 +597,24 @@
return self.raw.tell()
def truncate(self, pos=None):
+ # On Windows, the truncate operation changes the current position
+ # to the end of the file, which may leave us with desynchronized
+ # buffers.
+ # Since we promise that truncate() won't change the current position,
+ # the easiest thing is to capture current pos now and seek back to
+ # it at the end.
+
+ initialpos = self.tell()
if pos is None:
- pos = self.tell()
- return self.raw.truncate(pos)
+ pos = initialpos
+
+ # Flush the stream. We're mixing buffered I/O with lower-level I/O,
+ # and a flush may be necessary to synch both views of the current
+ # file state.
+ self.flush()
+ newpos = self.raw.truncate(pos)
+ self.seek(initialpos)
+ return newpos
### Flush and close ###
Modified: python/branches/py3k/Lib/test/test_file.py
==============================================================================
--- python/branches/py3k/Lib/test/test_file.py (original)
+++ python/branches/py3k/Lib/test/test_file.py Fri Oct 26 01:21:03 2007
@@ -181,12 +181,13 @@
self.assertEquals(d, s)
def testTruncateOnWindows(self):
+ # SF bug <http://www.python.org/sf/801631>
+ # "file.truncate fault on windows"
+
os.unlink(TESTFN)
+ f = open(TESTFN, 'wb')
- def bug801631():
- # SF bug <http://www.python.org/sf/801631>
- # "file.truncate fault on windows"
- f = open(TESTFN, 'wb')
+ try:
f.write(b'12345678901') # 11 bytes
f.close()
@@ -205,10 +206,8 @@
size = os.path.getsize(TESTFN)
if size != 5:
self.fail("File size after ftruncate wrong %d" % size)
-
- try:
- bug801631()
finally:
+ f.close()
os.unlink(TESTFN)
def testIteration(self):
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins