アプリケーションの更新をダウンロードしてインストールするためのqtフレームワークを構築しています(obj-cのsparkleなど)。ダウンロードは機能し、ダウンロードした zip ファイルは有効であり、コンテンツを手動で抽出できますが、フレームワークにquazip を介してコンテンツを解凍させると、ファイル (dll および exe) にはこれとこの文字列のみが含まれます:「MZ」と特別な文字間違ってエンコードされているため(Windowsではある種の正方形、Macでは「ê」)、正確に3バイトです。zip ファイルにテキスト ファイル (または xml) を含めると、手動で quazip を使用して正しく解凍されるため、ライブラリが正しくコンパイルされていると想定します。私のエラーはどこですか?
これは解決策の一部になると思いますhttp://en.wikipedia.org/wiki/DOS_MZ_executable ?
アップデートをインストールする私の方法は次のとおりです。
QuaZip archiveWrapper(filename); // The downloaded zip file
if (archiveWrapper.open(QuaZip::mdUnzip)) {
QuaZipFile archive(&archiveWrapper);
qDebug() << "Extracting files" << archiveWrapper.getFileNameList();
for (bool more = archiveWrapper.goToFirstFile(); more; more = archiveWrapper.goToNextFile()) {
QString filePath = archiveWrapper.getCurrentFileName();
QString destinationPath = QDir::cleanPath(QDir::currentPath() + QDir::separator() + filePath);
QString destinationBackup = destinationPath + "_backup";
qDebug() << "Extract" << filePath << "to" << destinationPath;
QuaZipFile zip(archive.getZipName(), filePath);
zip.open(QIODevice::ReadOnly);
QByteArray data = zip.readAll();
zip.close();
QFile oldFile(destinationPath);
if (oldFile.exists()) {
qDebug() << "Rename" << destinationPath << "to" << destinationBackup;
if (!oldFile.rename(destinationBackup)) {
qWarning("Could not rename %s to %s!", destinationPath.toUtf8().constData(), destinationBackup.toUtf8().constData());
}
}
QFile destination(destinationPath);
destination.open(QIODevice::WriteOnly);
destination.write(data.data());
destination.close();
if (oldFile.exists()) {
qDebug() << "Deleting backup of" << destinationPath;
if (!oldFile.remove()) {
qWarning("Could not delete %s!", destinationPath.toUtf8().constData());
}
}
}
if (archive.getZipError() == UNZ_OK) {
qDebug() << "All files extracted successfully";
qDebug() << "Restarting application...";
archiveWrapper.close();
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
} else {
qWarning("Error while extracting files (Error %d)", archive.getZipError());
archiveWrapper.close();
}
} else {
qWarning("Could not open archive to extract contents");
}
編集:
データ (QByteArray) が予想されるサイズであることがわかったので、問題は QFile が QByteArray の内容を exe/dll ファイルに本来あるべき方法で書き込まないことだと思いますか?
編集2:
書き込むファイル サイズのエラーが 1 つ見つかりました。
destination.write(data.data(), data.size());
それ以外の
destination.write(data.data());
それでも、exeにはアイコンがないか、実行可能です(ただし、正しいファイルサイズです)。しばらくの間、DOS ウィンドウが開いたり閉じたりします。ウイルス対策ソフトウェアは実行されていますが、アラートはありません (これは企業のノートブックであるため、シャットダウンできず、ウイルス対策ソフトウェアが実行されているかどうかに関係なく、更新フレームワークも実行されているはずです)。
編集3:
exeファイルの作成は複雑だと思っていましたが、テスト目的で「実装」したばかげたバグの混合でした。だから単純な
QFile destination(destinationPath);
destination.open(QIODevice::WriteOnly);
destination.write(data.data(), data.size())
十分なものです。