簡體   English   中英

我在 Linux 中使用 python 提取 zip 文件時的目錄相關問題,其中 zip 在窗口系統中使用 java 8 創建

[英]Directory related issue while I am extracting zip file using python inside Linux where zip created in window system using java 8

**我有一個文件夾,里面有一些文件和子目錄,其中也有一些文件。 但是當我使用以下 python 代碼在 Linux 系統中提取 zip 文件時。 它不是創建子目錄,而是創建名稱包含帶有分隔符的子目錄名稱的文件,其中我使用窗口系統中的 java 語言通過以下代碼創建了該 zip 文件。

示例:包含 abc.txt 的 ABC.zip 文件,子文件夾名稱 ABCD 和此 ABCD 文件夾包含一個文件名 test.txt 然后在 python 中,當我提取時,它創建了兩個文件 abc.txt,ABCD\\text.txt 名稱而不是ABCD 文件夾,然后在 ABCD text.txt 文件中**

Python端代碼:解壓zip文件

import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)

Java 端代碼:創建 zip 文件

String srcDir = "E:\\tomcat\\ai_data\\3";
File file = new File(srcDir);

File desFile = new File(srcDir.concat(".zip"));

final Path sourceDir = Paths.get(srcDir);
String zipFileName = srcDir.concat(".zip");
try {
    final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
    
    Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
            try {
                Path targetFile = sourceDir.relativize(file);
                 
                outputStream.putNextEntry(new ZipEntry(targetFile.toString()));
                byte[] bytes = Files.readAllBytes(file);
                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
                outputStream.closeEntry();
            } catch (IOException e) {
                LOGGER.error("Create Zip file " + file.getFileName(), e.getMessage());
            }
            return FileVisitResult.CONTINUE;
        }
    });
    outputStream.close();
} catch (IOException e) {}

問題似乎是 Java 代碼正在使用 Windows 樣式的分隔符 ( \\ ) 創建 zip 文件條目,然后 python 代碼看到該文件包含 ( \\ ) 並認為是名稱的一部分,因為它期待 ( / ) 作為路徑分隔符。 如果 java 代碼總是要創建一個要在 linux 系統上解壓縮的 zip 文件,請嘗試將 zip 條目的文件路徑轉換為使用 Linux 分隔符,例如:

Path targetFile = sourceDir.relativize(file);

//Convert seperators to Linux Style
String linuxStylePath = FilenameUtils.seperatorsToUnix(targetFile.toString());   

outputStream.putNextEntry(new ZipEntry(linuxStylePath));

參考Apache Commons IO 庫進行路徑轉換。

暫無
暫無

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

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