728x90
반응형
SMALL
- Manifest permisiion 추가
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- ZipManager Class
public class ZipManager {
private static final int BUFFER = 80000;
private static final int BUFFER_SIZE = 1024 * 2;
private static final int COMPRESSION_LEVEL = 8;
/**
* 파일 압축
* @param _files : 압축할 파일 이름 경로 리스트
* @param zipFileName : 저장될 경로의 파일 이름
*/
public void zip(String[] _files, String zipFileName) {
try {
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(zipFileName);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
dest));
byte data[] = new byte[BUFFER];
for (int i = 0; i < _files.length; i++) {
Log.v("Compress", "Adding: " + _files[i]);
FileInputStream fi = new FileInputStream(_files[i]);
origin = new BufferedInputStream(fi, BUFFER);
ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1));
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void unzip(String _zipFile, String _targetLocation) {
//create target location folder if not exist
dirChecker(_targetLocation);
try {
FileInputStream fin = new FileInputStream(_zipFile);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
//create dir if required while unzipping
if (ze.isDirectory()) {
dirChecker(ze.getName());
} else {
FileOutputStream fout = new FileOutputStream(_targetLocation + ze.getName());
for (int c = zin.read(); c != -1; c = zin.read()) {
fout.write(c);
}
zin.closeEntry();
fout.close();
}
}
zin.close();
} catch (Exception e) {
System.out.println(e);
}
}
/**
* 폴더 압축
* @param inputFolderPath : 압축할 폴더 경로
* @param outZipPath : 저장될 경로의 파일 이름
*/
public void zipFolder(String inputFolderPath, String outZipPath) throws Exception {
// 압축 대상(sourcePath)이 디렉토리나 파일이 아니면 리턴한다.
File sourceFile = new File(inputFolderPath);
if (!sourceFile.isFile() && !sourceFile.isDirectory()) {
throw new Exception("압축 대상의 파일을 찾을 수가 없습니다.");
}
FileOutputStream fos = null;
BufferedOutputStream bos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(outZipPath); // FileOutputStream
bos = new BufferedOutputStream(fos); // BufferedStream
zos = new ZipOutputStream(bos); // ZipOutputStream
zos.setLevel(COMPRESSION_LEVEL); // 압축 레벨 - 최대 압축률은 9, 디폴트 8
zipEntry(sourceFile, inputFolderPath, zos); // Zip 파일 생성
zos.finish(); // ZipOutputStream finish
} finally {
if (zos != null) {
zos.close();
}
if (bos != null) {
bos.close();
}
if (fos != null) {
fos.close();
}
}
}
public void zipEntry(File sourceFile, String sourcePath, ZipOutputStream zos) throws Exception {
// sourceFile 이 디렉토리인 경우 하위 파일 리스트 가져와 재귀호출
if (sourceFile.isDirectory()) {
if (sourceFile.getName().equalsIgnoreCase(".metadata")) { // .metadata 디렉토리 return
return;
}
File[] fileArray = sourceFile.listFiles(); // sourceFile 의 하위 파일 리스트
for (int i = 0; i < fileArray.length; i++) {
zipEntry(fileArray[i], sourcePath, zos); // 재귀 호출
}
} else { // sourcehFile 이 디렉토리가 아닌 경우
BufferedInputStream bis = null;
try {
String sFilePath = sourceFile.getPath();
Log.i("aa", sFilePath);
//String zipEntryName = sFilePath.substring(sourcePath.length() + 1, sFilePath.length());
StringTokenizer tok = new StringTokenizer(sFilePath,"/");
int tok_len = tok.countTokens();
String zipEntryName=tok.toString();
while(tok_len != 0){
tok_len--;
zipEntryName = tok.nextToken();
}
bis = new BufferedInputStream(new FileInputStream(sourceFile));
ZipEntry zentry = new ZipEntry(zipEntryName);
zentry.setTime(sourceFile.lastModified());
zos.putNextEntry(zentry);
byte[] buffer = new byte[BUFFER_SIZE];
int cnt = 0;
while ((cnt = bis.read(buffer, 0, BUFFER_SIZE)) != -1) {
zos.write(buffer, 0, cnt);
}
zos.closeEntry();
} finally {
if (bis != null) {
bis.close();
}
}
}
}
private void dirChecker(String dir) {
File f = new File(dir);
if (!f.isDirectory()) {
f.mkdirs();
}
}
}
- 권한 허가 코드 추가
companion object {
const val REQUEST_ALL_PERMISSION = 1
val PERMISSIONS = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE
//Manifest.permission.ACCESS_FINE_LOCATION
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!hasPermissions(this, PERMISSIONS)) {
requestPermissions(PERMISSIONS, REQUEST_ALL_PERMISSION)
}
}
private fun hasPermissions(context: Context?, permissions: Array<String>): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (permission in permissions) {
if (ActivityCompat.checkSelfPermission(context, permission)
!= PackageManager.PERMISSION_GRANTED
) {
return false
}
}
}
return true
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String?>,
grantResults: IntArray
) {
when (requestCode) {
REQUEST_ALL_PERMISSION -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permissions granted!", Toast.LENGTH_SHORT).show()
} else {
requestPermissions(permissions, REQUEST_ALL_PERMISSION)
Toast.makeText(this, "Permissions must be granted", Toast.LENGTH_SHORT).show()
}
}
}
}
- zip 파일 압축
//내부저장 경로이다.
private val mOutputDir = MyApplication.ApplicationContext().getExternalFilesDir(null)?.absolutePath
...
val s = arrayOfNulls<String>(2)
// Type the path of the files in here
s[0] = "$mOutputDir/test/test_img1.png"
s[1] = "$mOutputDir/test/test_img2.png"
// first parameter is d files second parameter is zip file name
val zipManager = ZipManager()
//저장할 폴더를 만든다.
val dir: File = File("$mOutputDir/zipTest")
if (!dir.exists()) {
ir.mkdirs()
}
//파일 압축
zipManager.zip(s, "$mOutputDir/zipTest/ziptest.zip")
//폴더 압축
zipManager.zipFolder("$mOutputDir/test","$mOutputDir/zipTest/ziptest.zip")
- 참고자료
728x90
반응형
LIST
'Android > Function' 카테고리의 다른 글
[안드로이드] 특정 확장자의 파일 목록 불러와서 최신순, 이름순 정렬 하기 (0) | 2020.09.03 |
---|---|
[Kotlin] 검색 필터링과 아이템 클릭 가능한 RecyclerView 만들기 (1) | 2020.09.01 |
[Android Test] Espresso 로 View의 Visibility 설정 하기 (0) | 2020.08.18 |
[안드로이드] 데이터 바인딩으로 EditText의 Text를 onClick 함수 parameter로 가져오기 (0) | 2020.08.18 |