/** * @brief 开始文件下载任务 * @author LuChenQun * @date 2015/07/05 * @return int 任务结果 */ int NetWork::startDownloadFile() { int code = CURLE_OK; QByteArray urlBa = m_url.toLocal8Bit(); char *url = urlBa.data(); // 初始化文件 code = initFile(); if (code != NETWORK_INIT_FILE_SUCCESS) { return code; } curl_easy_reset(m_curl); curl_easy_setopt(m_curl, CURLOPT_URL, url); curl_easy_setopt(m_curl, CURLOPT_LOW_SPEED_LIMIT, 10); curl_easy_setopt(m_curl, CURLOPT_LOW_SPEED_TIME, 300); curl_easy_setopt(m_curl, CURLOPT_HEADER, 1); curl_easy_setopt(m_curl, CURLOPT_NOBODY, 1); // 获取文件大小 code = curl_easy_perform(m_curl); double fileSize = 0; curl_easy_getinfo(m_curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &fileSize); emitFileSize(fileSize); if (getDiskFreeSpace("e:/") <= (m_fileSize)) { code = NETWORK_DISK_NO_SPACE; return code; } curl_easy_setopt(m_curl, CURLOPT_HEADER, 0); curl_easy_setopt(m_curl, CURLOPT_NOBODY, 0); curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, writeData); curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, this); curl_easy_setopt(m_curl, CURLOPT_RESUME_FROM_LARGE, m_breakPoint); // 断点续传 curl_easy_setopt(m_curl, CURLOPT_XFERINFOFUNCTION, progress); // 进度 curl_easy_setopt(m_curl, CURLOPT_XFERINFODATA, this); curl_easy_setopt(m_curl, CURLOPT_NOPROGRESS, 0L); curl_easy_setopt(m_curl, CURLOPT_NOSIGNAL, 1L); // 多线程需要注意的 curl_easy_setopt(m_curl, CURLOPT_FORBID_REUSE, 1); code = curl_easy_perform(m_curl); m_downloadFile.flush(); m_downloadFile.close(); return code; }
void QDriveInfoPrivate::doStat(uint requiredFlags) { if (data->getCachedFlag(requiredFlags)) return; if (!data->getCachedFlag(CachedRootPathFlag)) { initRootPath(); data->setCachedFlag(CachedRootPathFlag); } if (data->rootPath.isEmpty() || (data->getCachedFlag(CachedValidFlag) && !data->valid)) return; if (!data->getCachedFlag(CachedValidFlag)) requiredFlags |= CachedValidFlag; // force drive validation uint bitmask = 0; bitmask = CachedFileSystemNameFlag | CachedNameFlag | CachedReadOnlyFlag | CachedReadyFlag | CachedValidFlag; if (requiredFlags & bitmask) { getVolumeInfo(); if (data->valid && !data->ready) bitmask = CachedValidFlag; data->setCachedFlag(bitmask); if (!data->valid) return; } bitmask = CachedDeviceFlag; if (requiredFlags & bitmask) { data->device = getDevice(data->rootPath); data->setCachedFlag(bitmask); } bitmask = CachedBytesTotalFlag | CachedBytesFreeFlag | CachedBytesAvailableFlag; if (requiredFlags & bitmask) { getDiskFreeSpace(); data->setCachedFlag(bitmask); } bitmask = CachedTypeFlag; if (requiredFlags & bitmask) { data->type = determineType(data->rootPath); data->setCachedFlag(bitmask); } }