getStringArrayList получить только последний список без учета имени

Я внес некоторые изменения в код , данный Марк Байерсом . Внизу функция также добавит пустые каталоги, если они у вас есть. Примеры должны сделать более понятным, какой путь добавлен в zip.

#!/usr/bin/env python
import os
import zipfile

def addDirToZip(zipHandle, path, basePath=""):
    """
    Adding directory given by \a path to opened zip file \a zipHandle

    @param basePath path that will be removed from \a path when adding to archive

    Examples:
        # add whole "dir" to "test.zip" (when you open "test.zip" you will see only "dir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir')
        zipHandle.close()

        # add contents of "dir" to "test.zip" (when you open "test.zip" you will see only it's contents)
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir', 'dir')
        zipHandle.close()

        # add contents of "dir/subdir" to "test.zip" (when you open "test.zip" you will see only contents of "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir', 'dir/subdir')
        zipHandle.close()

        # add whole "dir/subdir" to "test.zip" (when you open "test.zip" you will see only "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir', 'dir')
        zipHandle.close()

        # add whole "dir/subdir" with full path to "test.zip" (when you open "test.zip" you will see only "dir" and inside it only "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir')
        zipHandle.close()

        # add whole "dir" and "otherDir" (with full path) to "test.zip" (when you open "test.zip" you will see only "dir" and "otherDir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir')
        addDirToZip(zipHandle, 'otherDir')
        zipHandle.close()
    """
    basePath = basePath.rstrip("\\/") + ""
    basePath = basePath.rstrip("\\/")
    for root, dirs, files in os.walk(path):
        # add dir itself (needed for empty dirs
        zipHandle.write(os.path.join(root, "."))
        # add files
        for file in files:
            filePath = os.path.join(root, file)
            inZipPath = filePath.replace(basePath, "", 1).lstrip("\\/")
            #print filePath + " , " + inZipPath
            zipHandle.write(filePath, inZipPath)

Выше - простая функция, которая должна работать для простых случаев. Вы можете найти более элегантный класс в моем Gist: https://gist.github.com/Eccenux/17526123107ca0ac28e6

0
задан RefaelJan 4 March 2019 в 22:27
поделиться

1 ответ

Я считаю, что это потому, что он хранит ссылку на ваш ArrayList, а не копию текущего «состояния» списка на каждой итерации цикла.

Например, вы сначала вставляете ссылку на свой ArrayList, когда он содержит 1 элемент. Затем вы вставляете ссылку на ваш ArrayList, когда он содержит 2 элемента. Оба являются просто ссылками, поэтому, когда вы действительно переходите к следующему Activity, он копирует полный текст ArrayList.

Чтобы это исправить, вы можете делать локальную копию ArrayList каждый раз, когда делаете цикл.

ArrayList<String> sections = new ArrayList<String>();
for(int i=1; i<=last; i++) {
    sections.clear();
    for(j = 0; j < size; j++){
        sections.add(someText);
    }

    // Creating a new local copy of the current list.
    ArrayList<String> newList = newArrayList<>(sections);

    // Inserting the local copy instead.
    ourIntent.putStringArrayListExtra("sections_"+i, newList);
}
0
ответ дан Advice-Dog 4 March 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: