def vsifile_11(): f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'wb') gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsisubfile/0_,/vsimem/vsifile_11', 'wb') gdal.VSIFWriteL('0123456789', 1, 10, f) if gdal.VSIFTruncateL(f, 10 + 4096 + 2) != 0: gdaltest.post_reason('fail') return 'fail' if gdal.VSIFTellL(f) != 10: gdaltest.post_reason('fail') return 'fail' if gdal.VSIFTruncateL(f, 0) != -1: gdaltest.post_reason('fail') return 'fail' gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'rb') data = gdal.VSIFReadL(1, 10 + 4096 + 2, f) gdal.VSIFCloseL(f) import struct data = struct.unpack('B' * len(data), data) if data[0] != 48 or data[9] != 57 or data[10] != 0 or data[10 + 4096 + 2 - 1] != 0: gdaltest.post_reason('fail') print(data) return 'fail' gdal.Unlink('/vsimem/vsifile_11') return 'success'
def vsifile_generic(filename): start_time = time.time() fp = gdal.VSIFOpenL(filename, 'wb+') assert fp is not None assert gdal.VSIFWriteL('0123456789', 1, 10, fp) == 10 assert gdal.VSIFFlushL(fp) == 0 assert gdal.VSIFTruncateL(fp, 20) == 0 assert gdal.VSIFTellL(fp) == 10 assert gdal.VSIFTruncateL(fp, 5) == 0 assert gdal.VSIFTellL(fp) == 10 assert gdal.VSIFSeekL(fp, 0, 2) == 0 assert gdal.VSIFTellL(fp) == 5 gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 7 assert abs(start_time - statBuf.mtime) <= 2 fp = gdal.VSIFOpenL(filename, 'rb') buf = gdal.VSIFReadL(1, 7, fp) assert gdal.VSIFWriteL('a', 1, 1, fp) == 0 assert gdal.VSIFTruncateL(fp, 0) != 0 gdal.VSIFCloseL(fp) assert buf.decode('ascii') == '01234XX' # Test append mode on existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 9 assert gdal.Unlink(filename) == 0 statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG) assert statBuf is None # Test append mode on non existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) assert statBuf.size == 2 assert gdal.Unlink(filename) == 0
def vsifile_12(): target_dir = 'tmp' if gdal.VSISupportsSparseFiles(target_dir) == 0: return 'skip' # Minimum value to make it work on NTFS block_size = 65536 f = gdal.VSIFOpenL(target_dir + '/vsifile_12', 'wb') gdal.VSIFWriteL('a', 1, 1, f) if gdal.VSIFTruncateL(f, block_size * 2) != 0: gdaltest.post_reason('fail') return 'fail' ret = gdal.VSIFGetRangeStatusL(f, 0, 1) # We could get unknown on nfs if ret == gdal.VSI_RANGE_STATUS_UNKNOWN: print('Range status unknown') else: if ret != gdal.VSI_RANGE_STATUS_DATA: gdaltest.post_reason('fail') print(ret) return 'fail' ret = gdal.VSIFGetRangeStatusL(f, block_size * 2 - 1, 1) if ret != gdal.VSI_RANGE_STATUS_HOLE: gdaltest.post_reason('fail') print(ret) return 'fail' gdal.VSIFCloseL(f) gdal.Unlink(target_dir + '/vsifile_12') return 'success'
def test_vsifile_3(): if not gdaltest.filesystem_supports_sparse_files('tmp'): pytest.skip() filename = 'tmp/vsifile_3' fp = gdal.VSIFOpenL(filename, 'wb+') gdal.VSIFTruncateL(fp, 10 * 1024 * 1024 * 1024) gdal.VSIFSeekL(fp, 0, 2) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdal.VSIFCloseL(fp) gdal.Unlink(filename) pytest.fail(pos) gdal.VSIFSeekL(fp, 0, 0) gdal.VSIFSeekL(fp, pos, 0) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdal.VSIFCloseL(fp) gdal.Unlink(filename) pytest.fail(pos) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) gdal.Unlink(filename) assert statBuf.size == 10 * 1024 * 1024 * 1024
def test_vsifile_11(): f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'wb') gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsisubfile/0_,/vsimem/vsifile_11', 'wb') gdal.VSIFWriteL('0123456789', 1, 10, f) assert gdal.VSIFTruncateL(f, 10 + 4096 + 2) == 0 assert gdal.VSIFTellL(f) == 10 assert gdal.VSIFTruncateL(f, 0) == -1 gdal.VSIFCloseL(f) f = gdal.VSIFOpenL('/vsimem/vsifile_11', 'rb') data = gdal.VSIFReadL(1, 10 + 4096 + 2, f) gdal.VSIFCloseL(f) import struct data = struct.unpack('B' * len(data), data) assert data[0] == 48 and data[9] == 57 and data[10] == 0 and data[10 + 4096 + 2 - 1] == 0 gdal.Unlink('/vsimem/vsifile_11')
def test_vsifile_vsicache_read_error(): tmpfilename = 'tmp/test_vsifile_vsicache_read_error.bin' f = gdal.VSIFOpenL(tmpfilename, 'wb') assert f try: gdal.VSIFTruncateL(f, 1000 * 1000) with gdaltest.config_option('VSI_CACHE', 'YES'): f2 = gdal.VSIFOpenL(tmpfilename, 'rb') assert f2 try: gdal.VSIFSeekL(f2, 500 * 1000, 0) # Truncate the file to simulate a read error gdal.VSIFTruncateL(f, 0) assert len(gdal.VSIFReadL(1, 5000 * 1000, f2)) == 0 # Extend the file again gdal.VSIFTruncateL(f, 1000 * 1000) # Read again gdal.VSIFSeekL(f2, 500 * 1000, 0) assert len(gdal.VSIFReadL(1, 50 * 1000, f2)) == 50 * 1000 # Truncate the file to simulate a read error gdal.VSIFTruncateL(f, 10) CHUNK_SIZE=32768 gdal.VSIFSeekL(f2, 0, 0) assert len(gdal.VSIFReadL(1, CHUNK_SIZE, f2)) == 10 gdal.VSIFSeekL(f2, 100, 0) assert len(gdal.VSIFReadL(1, CHUNK_SIZE, f2)) == 0 finally: gdal.VSIFCloseL(f2) finally: gdal.VSIFCloseL(f) gdal.Unlink(tmpfilename)
def test_vsifile_vsimem_truncate_zeroize(): filename = '/vsimem/test.bin' f = gdal.VSIFOpenL(filename, 'wb+') data = b'\xFF' * 10000 gdal.VSIFWriteL(data, 1, len(data), f) gdal.VSIFTruncateL(f, 0) gdal.VSIFSeekL(f, 10000, 0) gdal.VSIFWriteL(b'\x00', 1, 1, f) gdal.VSIFSeekL(f, 0, 0) assert gdal.VSIFReadL(1, 1, f) == b'\x00' gdal.VSIFCloseL(f)
def test_envi_truncated(): gdal.GetDriverByName('ENVI').CreateCopy('/vsimem/envi_truncated.dat', gdal.Open('data/byte.tif')) f = gdal.VSIFOpenL('/vsimem/envi_truncated.dat', 'wb+') gdal.VSIFTruncateL(f, int(20 * 20 / 2)) gdal.VSIFCloseL(f) with gdaltest.config_option('RAW_CHECK_FILE_SIZE', 'YES'): ds = gdal.Open('/vsimem/envi_truncated.dat') cs = ds.GetRasterBand(1).Checksum() ds = None gdal.GetDriverByName('ENVI').Delete('/vsimem/envi_truncated.dat') assert cs == 2315
def vsifile_generic(filename): fp = gdal.VSIFOpenL(filename, 'wb+') gdal.VSIFWriteL('0123456789', 1, 10, fp) gdal.VSIFTruncateL(fp, 5) if gdal.VSIFTellL(fp) != 10: gdaltest.post_reason('failure') return 'fail' gdal.VSIFSeekL(fp, 0, 2) if gdal.VSIFTellL(fp) != 5: gdaltest.post_reason('failure') return 'fail' gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL( filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) if statBuf.size != 7: gdaltest.post_reason('failure') print(statBuf.size) return 'fail' fp = gdal.VSIFOpenL(filename, 'rb') buf = gdal.VSIFReadL(1, 7, fp) gdal.VSIFCloseL(fp) if buf.decode('ascii') != '01234XX': gdaltest.post_reason('failure') return 'fail' gdal.Unlink(filename) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG) if statBuf is not None: gdaltest.post_reason('failure') return 'fail' return 'success'
def vsifile_3(): if not gdaltest.filesystem_supports_sparse_files('tmp'): return 'skip' filename = 'tmp/vsifile_3' fp = gdal.VSIFOpenL(filename, 'wb+') gdal.VSIFTruncateL(fp, 10 * 1024 * 1024 * 1024) gdal.VSIFSeekL(fp, 0, 2) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdaltest.post_reason('failure') gdal.VSIFCloseL(fp) gdal.Unlink(filename) print(pos) return 'fail' gdal.VSIFSeekL(fp, 0, 0) gdal.VSIFSeekL(fp, pos, 0) pos = gdal.VSIFTellL(fp) if pos != 10 * 1024 * 1024 * 1024: gdaltest.post_reason('failure') gdal.VSIFCloseL(fp) gdal.Unlink(filename) print(pos) return 'fail' gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL( filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) gdal.Unlink(filename) if statBuf.size != 10 * 1024 * 1024 * 1024: gdaltest.post_reason('failure') print(statBuf.size) return 'fail' return 'success'
def test_vsifile_12(): target_dir = 'tmp' if gdal.VSISupportsSparseFiles(target_dir) == 0: pytest.skip() # Minimum value to make it work on NTFS block_size = 65536 f = gdal.VSIFOpenL(target_dir + '/vsifile_12', 'wb') gdal.VSIFWriteL('a', 1, 1, f) assert gdal.VSIFTruncateL(f, block_size * 2) == 0 ret = gdal.VSIFGetRangeStatusL(f, 0, 1) # We could get unknown on nfs if ret == gdal.VSI_RANGE_STATUS_UNKNOWN: print('Range status unknown') else: assert ret == gdal.VSI_RANGE_STATUS_DATA ret = gdal.VSIFGetRangeStatusL(f, block_size * 2 - 1, 1) assert ret == gdal.VSI_RANGE_STATUS_HOLE gdal.VSIFCloseL(f) gdal.Unlink(target_dir + '/vsifile_12')
def vsifile_generic(filename): start_time = time.time() fp = gdal.VSIFOpenL(filename, 'wb+') if fp is None: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFWriteL('0123456789', 1, 10, fp) != 10: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFTruncateL(fp, 20) != 0: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFTellL(fp) != 10: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFTruncateL(fp, 5) != 0: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFTellL(fp) != 10: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFSeekL(fp, 0, 2) != 0: gdaltest.post_reason('failure') return 'fail' if gdal.VSIFTellL(fp) != 5: gdaltest.post_reason('failure') return 'fail' gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) if statBuf.size != 7: gdaltest.post_reason('failure') print(statBuf.size) return 'fail' if abs(start_time - statBuf.mtime) > 2: gdaltest.post_reason('failure') print(statBuf.mtime) return 'fail' fp = gdal.VSIFOpenL(filename, 'rb') buf = gdal.VSIFReadL(1, 7, fp) if gdal.VSIFWriteL('a', 1, 1, fp) != 0: gdaltest.post_reason('fail') return 'fail' if gdal.VSIFTruncateL(fp, 0) == 0: gdaltest.post_reason('fail') return 'fail' gdal.VSIFCloseL(fp) if buf.decode('ascii') != '01234XX': gdaltest.post_reason('failure') print(buf.decode('ascii')) return 'fail' # Test append mode on existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) if statBuf.size != 9: gdaltest.post_reason('failure') print(statBuf.size) return 'fail' if gdal.Unlink(filename) != 0: gdaltest.post_reason('failure') return 'fail' statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG) if statBuf is not None: gdaltest.post_reason('failure') return 'fail' # Test append mode on non existing file fp = gdal.VSIFOpenL(filename, 'ab') gdal.VSIFWriteL('XX', 1, 2, fp) gdal.VSIFCloseL(fp) statBuf = gdal.VSIStatL(filename, gdal.VSI_STAT_EXISTS_FLAG | gdal.VSI_STAT_NATURE_FLAG | gdal.VSI_STAT_SIZE_FLAG) if statBuf.size != 2: gdaltest.post_reason('failure') print(statBuf.size) return 'fail' if gdal.Unlink(filename) != 0: gdaltest.post_reason('failure') return 'fail' return 'success'
def truncate(self, pos=None): self._check_closed() if pos is None: pos = self.tell() gdal.VSIFTruncateL(self._vsif, pos) return pos