簡體   English   中英

使用 python 在 memory 中的 zipfile 中創建符號鏈接

[英]Create symlink inside a zipfile in memory using python

我正在尋找一種在 memory 中創建壓縮文件並在壓縮文件中包含符號鏈接的方法。 到目前為止,我已經找到此鏈接並嘗試以下代碼:

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()

如果鏈接直接位於解壓縮文件夾的根目錄下,則上面的代碼能夠成功創建符號鏈接,否則失敗(解壓縮后,如果我嘗試打開符號鏈接文件 bundle1/text1.txt,它會返回警告

無法完成操作,因為找不到“test_link.txt”的原始項目。

你能幫我看看如何讓符號鏈接 bundle1/test_link.txt 正常工作嗎?

如果您在bundle1中創建指向bundle/test.txt的符號鏈接,則目標必須位於bundle1/bundle/test.txt中。 符號鏈接總是相對於它們自己的路徑(當然除非它們以/開頭)

因此,要使其正常工作,您需要將鏈接目標更改為../bundle/test.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM