Issue 1276378: tarfile: adding filed that use direct device addressing (original) (raw)
The module tarfile has problems using os.stat() if the filenames use direct device addressing on Windows systems. For example: \?\GLOBALROOT\Device\HarddiskVolume1\TEMP\1.txt
The following error is reported: Traceback (most recent call last): File "C:\urbanp\py\test.py", line 9, in ?
tar.add('\\?\GLOBALROOT\Device\HarddiskVolume1\TEMP\1.txt',
'TEMP\1.txt')
File "C:\PROGRA1\Python23\lib\tarfile.py", line
1204, in add
tarinfo = self.gettarinfo(name, arcname)
File "C:\PROGRA1\Python23\lib\tarfile.py", line
1080, in gettarinfo
statres = os.lstat(name)
OSError: [Errno 2] No such file or directory:
'\\?\GLOBALROOT\Device\HarddiskVolume1\TEMP\1.txt'
As a solution we can use win32file.GetFileAttributesEx(). I mapped win32file.GetFileAttributesEx result into a tuple that has the same structure as a os.stat result tuple. Therefore, the same variable can be used.
The reason for using direct device addressing is that I need to create a tar package from a volume snapshot (vss on Windows 2003) that cannot be mounted. The solution also works on StorageCraft VSnap snapshots.