Bagaimanakah saya boleh mengganggu operasi salinan fail dan menamakan semula dalam Qt?

Susan Sarandon
Lepaskan: 2024-11-13 15:33:02
asal
994 orang telah melayarinya

How can I interrupt file copy and rename operations in Qt?

Mengganggu Operasi Salin dan Namakan Semula Fail

Dalam situasi di mana fail besar perlu dipindahkan dan pengguna memerlukan keupayaan untuk membatalkan operasi, kaedah salinan lalai() dan namakan semula() yang ditawarkan oleh Qt boleh mengehadkan. Cabarannya terletak pada mengganggu proses ini tanpa memperkenalkan overhed prestasi yang ketara atau kekecewaan pengguna.

Mentanya Sokongan Gangguan dalam Qt

Semasa menyiasat dokumentasi QFile, ternyata Qt tidak menyediakan mekanisme terbina dalam untuk mengganggu operasi copy() atau namakan semula(). Oleh itu, adalah perlu untuk mempertimbangkan strategi pelaksanaan tersuai untuk menangani keperluan ini.

Pelaksanaan Tersuai untuk Gangguan Salin

Untuk mencipta pembantu salinan tidak menyekat, satu pilihan ialah untuk melaksanakan utas khusus atau menggunakan utas utama. Dalam kedua-dua senario, penyalinan berpecah-belah diperlukan, di mana data dipindahkan dalam ketulan menggunakan penimbal. Dengan menggunakan penimbal, adalah mungkin untuk menjejaki kemajuan operasi dan menampung permintaan pembatalan pengguna.

Langkah teras untuk melaksanakan pembantu salinan tersuai boleh diterangkan seperti berikut:

  1. Buat kelas terbitan QObject untuk mengendalikan operasi penyalinan.
  2. Mulakan sifat untuk laluan sumber, laluan destinasi, saiz penimbal, kemajuan dan pembersihan semasa pembatalan.
  3. Tentukan permulaan( ) untuk memulakan proses penyalinan, yang termasuk membuka sumber dan fail destinasi serta memperuntukkan penimbal untuk pemindahan data.
  4. Laksanakan slot step(), menggunakan QMetaObject::invokeMethod() dengan Qt:: QeuedConnection, yang membenarkan pemprosesan berkala acara pengguna. Dalam slot ini:

    • Semak sama ada salinan tidak dibatalkan.
    • Baca dan tulis data dalam ketulan menggunakan fail sumber dan destinasi.
    • Kemas kini kemajuan berdasarkan nisbah kedudukan kepada saiz fail.
    • Gunakan slot step() secara rekursif sehingga keseluruhan fail disalin atau dibatalkan.
  5. Tentukan slot cancel() untuk membenarkan pengguna untuk mengganggu operasi penyalinan dan mengalih keluar fail destinasi jika perlu.
  6. Gunakan isyarat untuk memberitahu pihak yang berminat tentang perubahan kemajuan dan penyiapan (selesai()).

Contoh Pelaksanaan

Coretan kod berikut menyediakan contoh pelaksanaan kelas pembantu salinan:

class CopyHelper : public QObject {
    Q_OBJECT
    Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
public:
    CopyHelper(QString sPath, QString dPath, quint64 bSize = 1024 * 1024) :
        isCancelled(false), bufferSize(bSize), prog(0.0), source(sPath), destination(dPath), position(0) { }
    ~CopyHelper() { free(buff); }

    qreal progress() const { return prog; }
    void setProgress(qreal p) {
        if (p != prog) {
            prog = p;
            emit progressChanged();
        }
    }

public slots:
    void begin() {
        if (!source.open(QIODevice::ReadOnly)) {
            qDebug() << "could not open source, aborting";
            emit done();
            return;
        }
        fileSize = source.size();
        if (!destination.open(QIODevice::WriteOnly)) {
            qDebug() << "could not open destination, aborting";
            // maybe check for overwriting and ask to proceed
            emit done();
            return;
        }
        if (!destination.resize(fileSize)) {
            qDebug() << "could not resize, aborting";
            emit done();
            return;
        }
        buff = (char*)malloc(bufferSize);
        if (!buff) {
            qDebug() << "could not allocate buffer, aborting";
            emit done();
            return;
        }
        QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection);
        //timer.start();
    }
    void step() {
        if (!isCancelled) {
            if (position < fileSize) {
                quint64 chunk = fileSize - position;
                quint64 l = chunk > bufferSize ? bufferSize : chunk;
                source.read(buff, l);
                destination.write(buff, l);
                position += l;
                source.seek(position);
                destination.seek(position);
                setProgress((qreal)position / fileSize);
                //std::this_thread::sleep_for(std::chrono::milliseconds(100)); // for testing
                QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection);
            } else {
                //qDebug() << timer.elapsed();
                emit done();
                return;
            }
        } else {
            if (!destination.remove()) qDebug() << "delete failed";
            emit done();
        }
    }
    void cancel() { isCancelled = true; }

signals:
    void progressChanged();
    void done();

private:
    bool isCancelled;
    quint64 bufferSize;
    qreal prog;
    QFile source, destination;
    quint64 fileSize, position;
    char * buff;
    //QElapsedTimer timer;
};
Salin selepas log masuk

Kesimpulan

Dengan melaksanakan salinan tersuai pembantu atau menggunakan contoh yang disediakan, adalah mungkin untuk membuat operasi salinan fail tanpa penyekat yang boleh diganggu oleh pengguna. Pendekatan ini membolehkan pemindahan fail yang responsif dan mesra pengguna, menangani kekecewaan yang disebabkan oleh operasi yang panjang yang tidak boleh dibatalkan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengganggu operasi salinan fail dan menamakan semula dalam Qt?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan