ユーザーが電子メールでプロジェクトを共有できるようにするには、「プロジェクト」フォルダを開く必要があります。私は1つのジッパーに複数のファイルを圧縮するためのクラスを見つけましたが、私は私のジッパーにフォルダ構造を保持する必要があります。アンドロイドでこれを達成する方法はありますか?前もって感謝します。androidのファイルがいっぱいのフォルダを圧縮/圧縮
答えて
java.util.zipオブジェクトを使用する場合は、ディレクトリ構造を変更しないスクリプトを記述できます。
このコードはこのトリックを行う必要があります。
注:マニフェストファイルにWRITE_EXTERNAL_STORAGE権限を追加することで、アプリケーションにファイル書き込み権限を追加する必要があります。
/*
*
* Zips a file at a location and places the resulting zip file at the toLocation
* Example: zipFileAtPath("downloads/myfolder", "downloads/myFolder.zip");
*/
public boolean zipFileAtPath(String sourcePath, String toLocation) {
final int BUFFER = 2048;
File sourceFile = new File(sourcePath);
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(toLocation);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
dest));
if (sourceFile.isDirectory()) {
zipSubFolder(out, sourceFile, sourceFile.getParent().length());
} else {
byte data[] = new byte[BUFFER];
FileInputStream fi = new FileInputStream(sourcePath);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
}
out.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/*
*
* Zips a subfolder
*
*/
private void zipSubFolder(ZipOutputStream out, File folder,
int basePathLength) throws IOException {
final int BUFFER = 2048;
File[] fileList = folder.listFiles();
BufferedInputStream origin = null;
for (File file : fileList) {
if (file.isDirectory()) {
zipSubFolder(out, file, basePathLength);
} else {
byte data[] = new byte[BUFFER];
String unmodifiedFilePath = file.getPath();
String relativePath = unmodifiedFilePath
.substring(basePathLength);
FileInputStream fi = new FileInputStream(unmodifiedFilePath);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(relativePath);
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
}
}
/*
* gets the last path component
*
* Example: getLastPathComponent("downloads/example/fileToZip");
* Result: "fileToZip"
*/
public String getLastPathComponent(String filePath) {
String[] segments = filePath.split("/");
if (segments.length == 0)
return "";
String lastPathComponent = segments[segments.length - 1];
return lastPathComponent;
}
Hey @HailZeon!素晴らしいコード、そして本当に役に立つ。 getLastPathComponent(sourcePath)は何を行い、どのように定義されていますか?ありがとう! –
こんにちは@RaymondMachira。私はgetLastPathComponentの定義を追加しました。基本的にはパス( "folder1/subfolder/example.txt")をとり、 "folder1/subfolder /"を返します。 zipファイルにはその中に定義されているフォルダが含まれていない可能性がありますので、サブパスを削除して追加する必要があります。 – HailZeon
static final int BUFFER = 2048; – user1546570
これは、私はそれを行う方法です。
private static void zipFolder(String inputFolderPath, String outZipPath) {
try {
FileOutputStream fos = new FileOutputStream(outZipPath);
ZipOutputStream zos = new ZipOutputStream(fos);
File srcFile = new File(inputFolderPath);
File[] files = srcFile.listFiles();
Log.d("", "Zip directory: " + srcFile.getName());
for (int i = 0; i < files.length; i++) {
Log.d("", "Adding file: " + files[i].getName());
byte[] buffer = new byte[1024];
FileInputStream fis = new FileInputStream(files[i]);
zos.putNextEntry(new ZipEntry(files[i].getName()));
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
fis.close();
}
zos.close();
} catch (IOException ioe) {
Log.e("", ioe.getMessage());
}
}
public static boolean zip(File sourceFile, File zipFile) {
List<File> fileList = getSubFiles(sourceFile, true);
ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
int bufferSize = 1024;
byte[] buf = new byte[bufferSize];
ZipEntry zipEntry;
for(int i = 0; i < fileList.size(); i++) {
File file = fileList.get(i);
zipEntry = new ZipEntry(sourceFile.toURI().relativize(file.toURI()).getPath());
zipOutputStream.putNextEntry(zipEntry);
if (!file.isDirectory()) {
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
int readLength;
while ((readLength = inputStream.read(buf, 0, bufferSize)) != -1) {
zipOutputStream.write(buf, 0, readLength);
}
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
IoUtils.closeOS(zipOutputStream);
}
return true;
}
public static List<File> getSubFiles(File baseDir, boolean isContainFolder) {
List<File> fileList = new ArrayList<>();
File[] tmpList = baseDir.listFiles();
for (File file : tmpList) {
if (file.isFile()) {
fileList.add(file);
}
if (file.isDirectory()) {
if (isContainFolder) {
fileList.add(file); //key code
}
fileList.addAll(getSubFiles(file));
}
}
return fileList;
}
がこのlocationからzip4jライブラリを使用してください。 jarファイルを"app/libs/"
フォルダにインポートします。ディレクトリ/ファイルを圧縮するには、次のコードを使用してください。
try {
File input = new File("path/to/your/input/fileOrFolder");
String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "zippedItem.zip";
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_STORE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
File output = new File(destinationPath);
ZipFile zipFile = new ZipFile(output);
// .addFolder or .addFile depending on your input
if (sourceFile.isDirectory())
zipFile.addFolder(input, parameters);
else
zipFile.addFile(input, parameters);
// Your input file/directory has been zipped at this point and you
// can access it as a normal file using the following line of code
File zippedFile = zipFile.getFile();
} catch (ZipException e) {
Log.e(TAG, Log.getStackTraceString(e));
}
- 1. SSISのフォルダ圧縮
- 2. Android HttpURLConnection:gzip圧縮
- 3. アンドロイドのファイルとフォルダを圧縮する
- 4. apache圧縮圧縮されていない.jsファイルと.cssファイルを圧縮解除しますか?
- 5. Windows.Storage.Compression圧縮フォルダの解凍
- 6. javaプログラム(フォルダとファイル)の圧縮
- 7. PowerShellのファイル圧縮
- 8. MDBファイルの圧縮
- 9. クロスプラットフォームのファイル圧縮
- 10. 圧縮ファイル.pngファイル
- 11. フォルダとファイルを圧縮/解凍する
- 12. データ圧縮と画像圧縮の差
- 13. LZ4:圧縮画像フォーマットの圧縮
- 14. 圧縮画像android
- 15. Androidビットマップ圧縮エラー
- 16. teeを圧縮ファイル
- 17. フォルダ内のフォルダを圧縮する
- 18. android内の特定のフォルダのファイルを圧縮する
- 19. webpack圧縮が圧縮されていません
- 20. jpegoptim doesnt圧縮ファイル
- 21. node.js(Electron)を使用して圧縮されていないxlsxファイルを圧縮
- 22. S3のファイルを圧縮
- 23. Androidの圧縮解除.xml.gzファイル
- 24. Gzip(圧縮)で圧縮率の高いファイルを作成するには?
- 25. スタティックLZMA圧縮ファイルをプログラムで圧縮解除する
- 26. 圧縮された(圧縮された)フォルダが無効ですJava
- 27. ウェブページの圧縮
- 28. node.jsの圧縮
- 29. ビットマップデータの圧縮
- 30. 圧縮ヘッダーを設定し、圧縮してヘッダーを圧縮しますか?
明確にするために、Android開発プロジェクトまたはアプリで開発されたプロジェクトを意味しますか? –
アプリで開発されたプロジェクトです、残念です。また、私はこれが私が必要としていると思う:http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structureしかし、私はそれをコピーしたが、私はベストを尽くしたが、デキューキュー=新しいLinkedList ();働く私はDequeがインターフェースでLinkedListが実装していることを知っていますが、eclipesはエラーを返すだけです。 –
Mark
Nevermindは、多くの検索の後でそれを行う方法を見つけました:http://www.crazysquirrel.com/computing/java/basics/java-directory-zipping.jspx – Mark