counterexample

فعلن فقط برنامه نویسی

counterexample

فعلن فقط برنامه نویسی

دوشنبه, ۲۳ مرداد ۱۳۹۶، ۱۰:۳۴ ب.ظ

۰

بعضی مواقع لازمه تا تمام فایلهامون رو داخل یک فایل نگه داریم تا جابه جایی اونها راحت تر بشه. مثلن اگر کاربر کلی فایل با یک اپلیکیشن شما ساخته و نیاز داره تمام اون فایلها رو به کسی ایمیل کنه اگر تعداد فایلها زیاد باشه و یا حتی شامل فلدرهای داخلی هم باشه به اشتراک گذاری تک تک فایل ها کاری دشوار به نظر میاد و ممکنه نظم اون ها هم موقع ارسال به هم بریزه. بنابراین بهتره اون ها رو داخل یک فایل آرشیو کنیم مثلن اون ها رو zip کنیم. تو این پست نحوه ی انجام این کار رو بهتون آموزش میدیم. طوری که حتی فلدرهای داخلی هم با همون ترتیب داخل فایل zip شما قرار بگیرن.(به صورت بازگشتی تمام فلدرهای تو در تو رو بررسی میکنیم و با همون چیدمان داخل فایل zip قرار میدیم.)

کافیه این توابع رو تعریف کنید. برای شروع عملیات هم تابع zipFileAtPath رو با آرگومان های زیر فراخونی کنید.

zipFileAtPath("rootFolderPath", "zipFilePath/archive.zip");

rootFolderPath: آدرس فلدری که در ریشه ی فلدرهای شما قرار گرفته و عملیات آرشیو کردن قراره از اونجا شروع بشه و تمام فایلهای داخل اون رو بگرده.

zipFilePath/archive.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;
}


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();
        }
    }
}


public String getLastPathComponent(String filePath) {
    String[] segments = filePath.split("/");
    if (segments.length == 0)
        return "";
    String lastPathComponent = segments[segments.length - 1];
    return lastPathComponent;
}

تابع zipSubFolder برای بررسی فلدرها (یا بهتره بگیم زیرفلدرها) و انجام عملیات مربوط به اونها به کار میره.

تابع getLastPathComponent بخش انتهایی مسیر رو برمیداره که یا اسم فلدر هست یا اسم فایل مثلن اگر ورودی این تابع "downloads/example/fileToZip" باشه، خروجیش fileToZip میشه.

موافقین ۰ مخالفین ۰ ۹۶/۰۵/۲۳
counter example

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">