使用 python 在内存中的 zip 文件中创建符号链接
Create symlink inside a zipfile in memory using python
我正在寻找一种在内存中创建 zip 文件并在 zip 文件中包含 symlink 的方法。
到目前为止,我已经找到这个 link 并尝试以下代码:
from zipfile import ZipInfo
from zipfile import ZipFile
from zipfile import ZIP_DEFLATED, ZIP_STORED
from cStringIO import StringIO
import codecs
buf = StringIO()
zipfile = ZipFile( buf,'w')
zipinfo = ZipInfo()
zipinfo.filename = u'bundle/'
zipinfo.compress_type = ZIP_STORED
zipinfo.external_attr = 040755 << 16L # permissions drwxr-xr-x
zipinfo.external_attr |= 0x10 # MS-DOS directory flag
zipfile.writestr(zipinfo, '')
path = u'bundle/test.txt'
zipinfo = ZipInfo(path)
zipinfo.compress_type = ZIP_DEFLATED
zipinfo.external_attr = 0644 << 16L # permissions -r-wr--r--
zipfile.writestr(zipinfo, u'Test content')
dest = path
#create symbolic link (success)
zipinfo = ZipInfo()
zipinfo.filename = u'test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)
#create symbolic link (failed)
zipinfo = ZipInfo()
zipinfo.filename = u'bundle1/test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)
for info in zipfile.infolist():
print u'filename %s' %info.filename
print u'external_attr %s' %info.external_attr
print u'header_offset %s' %info.header_offset
print u'file_size %s' %info.file_size
print u'crc %s' %info.CRC
print u'\n\n'
zipfile.close()
buf.reset()
with codecs.open('test.zip', 'w') as f:
f.write(buf.getvalue())
buf.close()
如果 link 直接位于解压缩文件夹的根目录下,则上面的代码能够成功创建 symlink 否则会失败(解压缩后,如果我尝试打开 symlink 文件 bundle1/text1.txt,它 return 一个警告
The operation can’t be completed because the original item for
“test_link.txt” can’t be found.
你能帮我看看如何让 symlink bundle1/test_link.txt 正常工作吗?
如果您在 bundle1
中创建指向 bundle/test.txt
的符号 link,则目标必须位于 bundle1/bundle/test.txt
中。 Symlinks 总是相对于它们自己的路径(当然除非它们以 /
开头)
因此,要实现此功能,您需要将 link 目标更改为 ../bundle/test.txt
。
我正在寻找一种在内存中创建 zip 文件并在 zip 文件中包含 symlink 的方法。 到目前为止,我已经找到这个 link 并尝试以下代码:
from zipfile import ZipInfo
from zipfile import ZipFile
from zipfile import ZIP_DEFLATED, ZIP_STORED
from cStringIO import StringIO
import codecs
buf = StringIO()
zipfile = ZipFile( buf,'w')
zipinfo = ZipInfo()
zipinfo.filename = u'bundle/'
zipinfo.compress_type = ZIP_STORED
zipinfo.external_attr = 040755 << 16L # permissions drwxr-xr-x
zipinfo.external_attr |= 0x10 # MS-DOS directory flag
zipfile.writestr(zipinfo, '')
path = u'bundle/test.txt'
zipinfo = ZipInfo(path)
zipinfo.compress_type = ZIP_DEFLATED
zipinfo.external_attr = 0644 << 16L # permissions -r-wr--r--
zipfile.writestr(zipinfo, u'Test content')
dest = path
#create symbolic link (success)
zipinfo = ZipInfo()
zipinfo.filename = u'test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)
#create symbolic link (failed)
zipinfo = ZipInfo()
zipinfo.filename = u'bundle1/test_link.txt'
zipinfo.external_attr |= 0120000 << 16L # symlink file type
zipinfo.compress_type = ZIP_STORED
zipfile.writestr(zipinfo, dest)
for info in zipfile.infolist():
print u'filename %s' %info.filename
print u'external_attr %s' %info.external_attr
print u'header_offset %s' %info.header_offset
print u'file_size %s' %info.file_size
print u'crc %s' %info.CRC
print u'\n\n'
zipfile.close()
buf.reset()
with codecs.open('test.zip', 'w') as f:
f.write(buf.getvalue())
buf.close()
如果 link 直接位于解压缩文件夹的根目录下,则上面的代码能够成功创建 symlink 否则会失败(解压缩后,如果我尝试打开 symlink 文件 bundle1/text1.txt,它 return 一个警告
The operation can’t be completed because the original item for “test_link.txt” can’t be found.
你能帮我看看如何让 symlink bundle1/test_link.txt 正常工作吗?
如果您在 bundle1
中创建指向 bundle/test.txt
的符号 link,则目标必须位于 bundle1/bundle/test.txt
中。 Symlinks 总是相对于它们自己的路径(当然除非它们以 /
开头)
因此,要实现此功能,您需要将 link 目标更改为 ../bundle/test.txt
。