解压器忽略空目录
unzipper ignores empty directory
我是一名日本网络开发人员。
我英语不好,抱歉。
https://www.npmjs.com/package/unzipper
我正在使用这个库。
这是我的代码。
// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'
export default ({ inputFilePath, outputFilePath }) => {
return new Promise(async (resolve, reject, onCancel) => {
try {
await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Extract({ path: outputFilePath })))
.then(resolve)
} catch (error) {
reject(error)
}
})
}
const streamPromise = (stream) => {
return new Promise((resolve, reject) => {
stream.on('end', () => {
resolve('end')
})
stream.on('finish', () => {
resolve('finish')
})
stream.on('error', (error) => {
reject(error)
})
})
}
但是没有文件的目录不会被复制。
有什么办法可以解决这个问题?
- 您想使用
unzipper
. 解压缩 zip 文件
- 您还想导出没有文件的目录。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几个答案。所以请把这当作其中之一。
修改点:
- 本次修改,当文件类型为"Directory"时,会新建一个目录。这样就可以导出没有文件的目录了。
修改后的脚本:
请修改如下
// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'
import path from 'path' // Added
// Modified
export default ({ inputFilePath, outputFilePath }) => {
return new Promise(async (resolve, reject, onCancel) => {
try {
await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Parse()), outputFilePath)
.then(resolve)
} catch (error) {
reject(error)
}
})
}
// Modified
const streamPromise = (stream, outputFilePath) => {
return new Promise((resolve, reject) => {
stream.on("entry", entry => {
const fileName = entry.path;
const type = entry.type;
if (type == "Directory") {
fs.mkdirSync(path.join(outputFilePath, fileName));
} else if (type == "File") {
entry.pipe(fs.createWriteStream(path.join(outputFilePath, fileName)));
}
});
stream.on("end", () => {
resolve("end");
});
stream.on("finish", () => {
resolve("finish");
});
stream.on("error", error => {
reject(error);
});
});
};
参考:
在我的环境中,我可以确认修改后的脚本有效。但在您的环境中,脚本无法运行,我深表歉意。
我是一名日本网络开发人员。
我英语不好,抱歉。
https://www.npmjs.com/package/unzipper
我正在使用这个库。
这是我的代码。
// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'
export default ({ inputFilePath, outputFilePath }) => {
return new Promise(async (resolve, reject, onCancel) => {
try {
await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Extract({ path: outputFilePath })))
.then(resolve)
} catch (error) {
reject(error)
}
})
}
const streamPromise = (stream) => {
return new Promise((resolve, reject) => {
stream.on('end', () => {
resolve('end')
})
stream.on('finish', () => {
resolve('finish')
})
stream.on('error', (error) => {
reject(error)
})
})
}
但是没有文件的目录不会被复制。
有什么办法可以解决这个问题?
- 您想使用
unzipper
. 解压缩 zip 文件
- 您还想导出没有文件的目录。
如果我的理解是正确的,这个修改怎么样?我认为您的情况有几个答案。所以请把这当作其中之一。
修改点:
- 本次修改,当文件类型为"Directory"时,会新建一个目录。这样就可以导出没有文件的目录了。
修改后的脚本:
请修改如下
// unzip module
import fs from 'fs-extra'
import unzipper from 'unzipper'
import Promise from 'bluebird'
import path from 'path' // Added
// Modified
export default ({ inputFilePath, outputFilePath }) => {
return new Promise(async (resolve, reject, onCancel) => {
try {
await streamPromise(fs.createReadStream(inputFilePath).pipe(unzipper.Parse()), outputFilePath)
.then(resolve)
} catch (error) {
reject(error)
}
})
}
// Modified
const streamPromise = (stream, outputFilePath) => {
return new Promise((resolve, reject) => {
stream.on("entry", entry => {
const fileName = entry.path;
const type = entry.type;
if (type == "Directory") {
fs.mkdirSync(path.join(outputFilePath, fileName));
} else if (type == "File") {
entry.pipe(fs.createWriteStream(path.join(outputFilePath, fileName)));
}
});
stream.on("end", () => {
resolve("end");
});
stream.on("finish", () => {
resolve("finish");
});
stream.on("error", error => {
reject(error);
});
});
};
参考:
在我的环境中,我可以确认修改后的脚本有效。但在您的环境中,脚本无法运行,我深表歉意。