از حالت فشرده در آوردن (unzip کردن) یک فایل فشرده (فایل zip شده) موجود در حافظه خارجی (External Storage)، در برنامه نویسی اندروید
فرض کنید که در حافظه خارجی (External Storage)، یک پوشه (Folder) با نام myFolder داریم که در آن، یک فایل فشرده با نام kelidestan.zip قرار دارد. اکنون قصد داریم که این فایل را از حالت فشرده در بیاوریم. برای این منظور، کدهای زیر را اجرا می کنیم :
String directory_string = root.getAbsolutePath() + "/myFolder/";
String zipName = "kelidestan.zip";
unpackZip(directory_string, zipName);
در کدهای بالا، از تابعی با نام unpackZip استفاده شده که آن را خودمان با کدهای زیر تعریف می کنیم :
InputStream is;
ZipInputStream zis;
try
{
String filename;
is = new FileInputStream(path + zipname);
zis = new ZipInputStream(new BufferedInputStream(is));
ZipEntry ze;
byte[] buffer = new byte[1024];
int count;
while ((ze = zis.getNextEntry()) != null)
{
// zapis do souboru
filename = ze.getName();
// Need to create directories if not exists, or
// it will generate an Exception...
if (ze.isDirectory()) {
File fmd = new File(path + filename);
fmd.mkdirs();
continue;
}
FileOutputStream fout = new FileOutputStream(path + filename);
// cteni zipu a zapis
while ((count = zis.read(buffer)) != -1)
{
fout.write(buffer, 0, count);
}
fout.close();
zis.closeEntry();
}
zis.close();
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}
یعنی به عنوان مثال، کل کدهای Activity می تواند به صورت زیر باشد (یک Activity دلخواه) :
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File root = android.os.Environment.getExternalStorageDirectory();
String directory_string = root.getAbsolutePath() + "/myFolder/";
String zipName = "kelidestan.zip";
unpackZip(directory_string, zipName);
}
private boolean unpackZip(String path, String zipname){
InputStream is;
ZipInputStream zis;
try
{
String filename;
is = new FileInputStream(path + zipname);
zis = new ZipInputStream(new BufferedInputStream(is));
ZipEntry ze;
byte[] buffer = new byte[1024];
int count;
while ((ze = zis.getNextEntry()) != null)
{
// zapis do souboru
filename = ze.getName();
// Need to create directories if not exists, or
// it will generate an Exception...
if (ze.isDirectory()) {
File fmd = new File(path + filename);
fmd.mkdirs();
continue;
}
FileOutputStream fout = new FileOutputStream(path + filename);
// cteni zipu a zapis
while ((count = zis.read(buffer)) != -1)
{
fout.write(buffer, 0, count);
}
fout.close();
zis.closeEntry();
}
zis.close();
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}
}
معمولا در کامپیوتر، وقتی یک فایل zip شده را unzip می کنیم، پوشه ای دقیقا هم نام با آن فایل zip می سازد و فایل ها درون آن قرار می گیرند، ولی کد بالا، چنین پوشه ای را نمی سازد.
دقت شود که در صورت کدنویسی برای فرآیندی که نیاز به دسترسی به حافظه خارجی (External Storage) دارد، باید کدهای زیر درون AndroidManifest.xml نوشته شود (برای اجازه دادن برای نوشتن در حافظه خارجی و یا خواندن از حافظه خارجی) :
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
سلام
اگر بخایم پسورد فایل رو هم در سورس قرار بدیم کجا باید نوشت؟
لطفا به این سوال جواب بدید.