رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران
  • 0
GornerLabo

استخراج محتوای فایل‌های فشرده در Qt

سوال

ارسال شده در (ویرایش شده)

با سلام و خسته نباشید خدمت اساتید محترم. اگه بخواییم در QWidget یک فایل فشرده با فرمت های مختلف همچون zip , RAR , tar و ... را فراخوانی کنیم و فایل های محتوایی که در این فایل فشرده هست را در برنامه استخراج (Extract) کرده و به صورت یک لیست دربیاریم و به صورت دلخواه هر فایل را جدا استفاده کنیم باید به چه شکل عمل کنیم؟ آیا کتابخانه خاصی داره برای این کار ؟ اگر مثال در این مورد سراغ دارین ممنون میشم کمک کنید.

با تشکر

ویرایش شده در توسط کامبیز اسدزاده
تصحیح نگارش

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

15 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 0
در 21 ساعت قبل، GornerLabo گفته است :

برای فرمت zip حل شد!

طبق این لینک

حالا برای فرمت های tar و lz4 باید به چه شکل عمل کرد؟

اول باید کتابخانه بیلد بشه، با دستورات زیر:

tar xzf libarchive-xxx.tar.gz
cd libarchive-xxx
./configure
make
make check
make install

برای افزودن این کتابخانه به Qt از بخش Add Library پروژه اقدام کن، خروجیش چیزی شبیه به این باید بشه من آخرین نسخه رو امتحان کردم:

LIBS += -L$$PWD/../../../Downloads/libarchive-3.3.3/build/ -larchive

INCLUDEPATH += $$PWD/../../../Downloads/libarchive-3.3.3
DEPENDPATH += $$PWD/../../../Downloads/libarchive-3.3.3

PRE_TARGETDEPS += $$PWD/../../../Downloads/libarchive-3.3.3/build/libarchive.a

در نهایت یک کد آزمایشی به صورت زیر برای زیپ کردن در قلب .tar امتحان کردم که مشکلی نداره و کار می‌کنه. فرصت زیادی ندارم تا همه مواردش رو چک کنم، شما طبق مستندات و مثال‌های پیش‌فرض امتحان و به کیوت اضافش بکنید.

#include <QCoreApplication>
#include <QString>
#include <QByteArray>
#include <QFileInfo>
#include <QDebug>
#include <QDirIterator>
#include <libarchive/archive.h>
#include <libarchive/archive_entry.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    QString directory = "iostreamir";
    struct archive *a;
    struct archive_entry *entry;
    struct stat st;
    char buff[8192];
    size_t bytes_read;
    int fd;

    QByteArray outArray = directory.toLocal8Bit() + ".tar";
    char *outDirectory = outArray.data();
    qDebug() << outDirectory;

    QByteArray inputArray = directory.toLocal8Bit();
    char *inputDirectory = inputArray.data();
    qDebug() << inputDirectory;

    QFileInfo inputInfo;
    inputInfo.setFile(directory);

    // the name of the directory
    QByteArray pathArray = inputInfo.fileName().toLocal8Bit();
    char *pathDirectory = pathArray.data();
    qDebug() << pathDirectory;

    a = archive_write_new();
    archive_write_add_filter_gzip(a);
    archive_write_set_format_pax_restricted(a);
    archive_write_open_filename(a, outDirectory);

    QDirIterator it(directory, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        entry = archive_entry_new();
        stat(inputDirectory, &st);

        archive_entry_set_pathname(entry, it.next().toLocal8Bit().constData());
        archive_entry_set_filetype(entry, AE_IFDIR);
        archive_entry_copy_stat(entry, &st);
        archive_write_header(a, entry);

        fd = open(inputDirectory, O_RDONLY);
        bytes_read = read(fd, buff, sizeof(buff));
        while (bytes_read > 0) {
            archive_write_data(a, buff, bytes_read);
            bytes_read = read(fd, buff, sizeof(buff));
        }
        close(fd);
        archive_entry_free(entry);

        archive_write_finish_entry(a);
        archive_write_close(a);
        archive_write_free(a);
    }

    return 0;
}

 

  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 2

با سلام

میتونید از کتابخانه هایی که برای این کار وجود داره استفاده کنید نگاهی به بخش Compression لینک Awesome C/C++ بندازید کتابخانه‌های خوبی فراهم هست.

موفق باشید.

  • پسندیدن 1
  • هاها! 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در ۱ ساعت قبل، GornerLabo گفته است :

با سلام و خسته نباشید خدمت اساتید محترم. اگه بخواییم در QWidget یک فایل فشرده با فرمت های مختلف همچون zip , RAR , tar و ... را فراخوانی کنیم و فایل های محتوایی که در این فایل فشرده هست را در برنامه استخراج (Extract) کرده و به صورت یک لیست دربیاریم و به صورت دلخواه هر فایل را جدا استفاده کنیم باید به چه شکل عمل کنیم؟ آیا کتابخانه خاصی داره برای این کار ؟ اگر مثال در این مورد سراغ دارین ممنون میشم کمک کنید.

با تشکر

با سلام کتابخانه archive کتابخونه ی مناسب توی این زمینه هست.

از تمام فرمتها پشتیبانی می کند!

مثال ها و مستندات

  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، بهنام صباغی گفته است :

با سلام

میتونید از کتابخانه هایی که برای این کار وجود داره استفاده کنید نگاهی به بخش Compression لینک Awesome C/C++ بندازید کتابخانه‌های خوبی فراهم هست.

موفق باشید.

دوره تصویری برای آموزش این کتابخانه دارین؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در ۱ ساعت قبل، GornerLabo گفته است :

دوره تصویری برای آموزش این کتابخانه دارین؟

یک کتابخانه نیست اینی که من دادم لینک بهترین کتابخانه‌های سی پلاس پلاس هست توی زمینه های مختلف شما کدوم رو میخواید ؟ جستجو کنید آموزشش رو بعید میدونم مثلا توی لیندا یا یودمی پیدا کنید ولی توی یو تیوب برای هر کتابخانه احتمالش خیلی زیاده که ویدئو پیدا بشه از دوستان هندی یا چینی .

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
ارسال شده در (ویرایش شده)

برای فرمت zip حل شد!

طبق این لینک

 

حالا برای فرمت های tar و lz4 باید به چه شکل عمل کرد؟

ویرایش شده در توسط GornerLabo

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 23 ساعت قبل، کامبیز اسدزاده گفته است :

اول باید کتابخانه بیلد بشه، با دستورات زیر:

 
tar xzf libarchive-xxx.tar.gz
 
cd libarchive-xxx
 
./configure
 
make
 
make check
 
make install

برای افزودن این کتابخانه به Qt از بخش Add Library پروژه اقدام کن، خروجیش چیزی شبیه به این باید بشه من آخرین نسخه رو امتحان کردم:

 
LIBS += -L$$PWD/../../../Downloads/libarchive-3.3.3/build/-larchive
 
 
 
INCLUDEPATH += $$PWD/../../../Downloads/libarchive-3.3.3
 
DEPENDPATH += $$PWD/../../../Downloads/libarchive-3.3.3
 
 
 
PRE_TARGETDEPS += $$PWD/../../../Downloads/libarchive-3.3.3/build/libarchive.a

در نهایت یک کد آزمایشی به صورت زیر برای زیپ کردن در قلب .tar امتحان کردم که مشکلی نداره و کار می‌کنه. فرصت زیادی ندارم تا همه مواردش رو چک کنم، شما طبق مستندات و مثال‌های پیش‌فرض امتحان و به کیوت اضافش بکنید.

 
#include <QCoreApplication>
 
#include <QString>
 
#include <QByteArray>
 
#include <QFileInfo>
 
#include <QDebug>
 
#include <QDirIterator>
 
#include <libarchive/archive.h>
 
#include <libarchive/archive_entry.h>
 
#include <sys/types.h>
 
#include <sys/stat.h>
 
#include <fcntl.h>
 
 
 
int main()
 
{
 
QString directory = "iostreamir";
 
struct archive *a;
 
struct archive_entry *entry;
 
struct stat st;
 
char buff[8192];
 
size_t bytes_read;
 
int fd;
 
 
 
QByteArray outArray = directory.toLocal8Bit() + ".tar";
 
char *outDirectory = outArray.data();
 
qDebug() << outDirectory;
 
 
 
QByteArray inputArray = directory.toLocal8Bit();
 
char *inputDirectory = inputArray.data();
 
qDebug() << inputDirectory;
 
 
 
QFileInfo inputInfo;
 
inputInfo.setFile(directory);
 
 
 
// the name of the directory
 
QByteArray pathArray = inputInfo.fileName().toLocal8Bit();
 
char *pathDirectory = pathArray.data();
 
qDebug() << pathDirectory;
 
 
 
a = archive_write_new();
 
archive_write_add_filter_gzip(a);
 
archive_write_set_format_pax_restricted(a);
 
archive_write_open_filename(a, outDirectory);
 
 
 
QDirIterator it(directory, QDirIterator::Subdirectories);
 
while (it.hasNext()) {
 
entry = archive_entry_new();
 
stat(inputDirectory, &st);
 
 
 
archive_entry_set_pathname(entry, it.next().toLocal8Bit().constData());
 
archive_entry_set_filetype(entry, AE_IFDIR);
 
archive_entry_copy_stat(entry, &st);
 
archive_write_header(a, entry);
 
 
 
fd = open(inputDirectory, O_RDONLY);
 
bytes_read = read(fd, buff, sizeof(buff));
 
while (bytes_read > 0) {
 
archive_write_data(a, buff, bytes_read);
 
bytes_read = read(fd, buff, sizeof(buff));
 
}
 
close(fd);
 
archive_entry_free(entry);
 
 
 
archive_write_finish_entry(a);
 
archive_write_close(a);
 
archive_write_free(a);
 
}
 
 
 
return 0;
 
}

استاد ممنون بابت پاسخ گویی. من ازکاربرای ویندوزم. برای بیلد در ویندوز و کامپایلر mingw32 باید به چه نحو عمل کرد؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 11 دقیقه قبل، GornerLabo گفته است :

استاد ممنون بابت پاسخ گویی. من ازکاربرای ویندوزم. برای بیلد در ویندوز و کامپایلر mingw32 باید به چه نحو عمل کرد؟

سورس کد کتابخانه‌ رو دریافت و توسط CMake GUI بسازیدش.

برنامه‌ command prompt رو اجرا و سورس رو با دستور mingw32-make کامپایل کنید.

راهنمای ساخت این کتابخانه در Mingw و MSVC

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 11 ساعت قبل، کامبیز اسدزاده گفته است :

سورس کد کتابخانه‌ رو دریافت و توسط CMake GUI بسازیدش.

برنامه‌ command prompt رو اجرا و سورس رو با دستور mingw32-make کامپایل کنید.

راهنمای ساخت این کتابخانه در Mingw و MSVC

مشکل بیلد هم حل شد. سپاس استاد.

برای اضافه کردن به پروژه از گزینه add library استفاده میکنم . برای این منظور بعد add library ، مسیر کتابخانه و فایل .a رو فقط میتونم اضافه کنم که با بیلد کردن پروژه با ارور مواجه میشم. گوگل کردم و چندجایی دیدم مشکل داشتن در ویندوز برای اضافه کردن. اینم حل شه ازتون ممنون میشم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 8 دقیقه قبل، GornerLabo گفته است :

مشکل بیلد هم حل شد. سپاس استاد.

برای اضافه کردن به پروژه از گزینه add library استفاده میکنم . برای این منظور بعد add library ، مسیر کتابخانه و فایل .a رو فقط میتونم اضافه کنم که با بیلد کردن پروژه با ارور مواجه میشم. گوگل کردم و چندجایی دیدم مشکل داشتن در ویندوز برای اضافه کردن. اینم حل شه ازتون ممنون میشم

خب خطایی که می‌گیری چی هست؟

سعی کن از حالت داینامیک استفاده کنی، حالت Release یا Debug کتابخونه رو هم با برنامه‌ی خودت هماهنگ کن.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در ۱ ساعت قبل، کامبیز اسدزاده گفته است :

خب خطایی که می‌گیری چی هست؟

سعی کن از حالت داینامیک استفاده کنی، حالت Release یا Debug کتابخونه رو هم با برنامه‌ی خودت هماهنگ کن.

بعد بیلد ، کتابخانه به این شکل دراومد. لینک دانلود کتابخانه بیلد شده با کامپایلر mingw

مشکل حالا نحوه اد کردن این کتابخانه س. فایل dll داره در فولدر bin ولی فایل .h نداره که داینامیک ادد کنم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 9 ساعت قبل، GornerLabo گفته است :

بعد بیلد ، کتابخانه به این شکل دراومد. لینک دانلود کتابخانه بیلد شده با کامپایلر mingw

مشکل حالا نحوه اد کردن این کتابخانه س. فایل dll داره در فولدر bin ولی فایل .h نداره که داینامیک ادد کنم

کتابخانه را که بیلد کردین قرار نیست .h را هم کنار فایل‌های بیلد شده قرار بدین!

شما باید پوشه‌ی libarchive را از کتابخانه‌ی اصلی و فایل‌های بیلد شده را به صورت دستی بهش اضافه کنید.

 

  • پسندیدن 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 15 دقیقه قبل، کامبیز اسدزاده گفته است :

کتابخانه را که بیلد کردین قرار نیست .h را هم کنار فایل‌های بیلد شده قرار بدین!

شما باید پوشه‌ی libarchive را از کتابخانه‌ی اصلی و فایل‌های بیلد شده را به صورت دستی بهش اضافه کنید.

 

تشکر استاد

  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در ۱ ساعت قبل، GornerLabo گفته است :

تشکر استاد

خواهش می‌کنم.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
ارسال شده در (ویرایش شده)

روش دیگه برای ادد کردن کتابخانه رو هم امتحان کردم اوکی شد:

یک پوشه ایجاد کنید مثلا در مسیر C:\Qt\lib-archive

مرحله بعد در داخل همین پوشه lib-archive برای راحتی می‌توانید دو پوشه به نام های include و lib ایجاد کنید.

در این مرحله باید فایل های .h از کتابخانه اصلی را در پوشه include کپی کنید و همچنین فایل بیلد شده از dll ها ( یا پسوند .a ) را در پوشه lib کپی کنید.

به Qt رفته و یک پروژه ایجاد کنید و در داخل فایل .pro به صورت دستی کد زیر را اضافه کنید:

INCLUDEPATH += "C:/Qt/lib-archive/include"
LIBS += -L "C:/Qt/lib-archive/lib"
LIBS += -llibarchive

اکنون تغییرات فایل .pro  را ذخیره کرده و پروژه را یک بار بیلد کنید، کار تمام است و برای آزمایش می‌توانید طبق مثال های کتابخانه عمل کنید.

با تشکر فراوان از اساتید محترم بخصوص آقای @کامبیز اسدزاده 🙂

ویرایش شده در توسط کامبیز اسدزاده
تصحیح نگارش

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×