wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
FileUtils.h
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <QDir>
7#include <QFile>
8#include <QFileInfo>
9#include <QString>
10
11#include "App/Core/Common.h"
12
13namespace FileUtils {
14
17inline void copyToDir(const QString &srcPath, const QString &destDir)
18{
19 if (srcPath.isEmpty() || srcPath.startsWith(":/") || destDir.isEmpty()) {
20 return;
21 }
22
23 const QFileInfo srcInfo(srcPath);
24 if (!srcInfo.exists()) {
25 return;
26 }
27
28 if (srcInfo.absoluteDir() == QDir(destDir)) {
29 return;
30 }
31
32 const QString dest = destDir + "/" + srcInfo.fileName();
33 if (!QFile::exists(dest)) {
34 QFile srcFile(srcPath);
35 if (!srcFile.copy(dest)) {
36 throw PANDACEPTION_WITH_CONTEXT("FileUtils", "Could not copy %1 to %2: %3",
37 srcPath, dest, srcFile.errorString());
38 }
39 }
40}
41
45inline bool filesHaveSameContent(const QFileInfo &a, const QFileInfo &b)
46{
47 const QString canonicalA = a.canonicalFilePath();
48 if (!canonicalA.isEmpty() && canonicalA == b.canonicalFilePath()) {
49 return true; // literally the same file on disk
50 }
51 if (a.size() != b.size()) {
52 return false;
53 }
54 QFile fileA(a.absoluteFilePath());
55 QFile fileB(b.absoluteFilePath());
56 if (!fileA.open(QIODevice::ReadOnly) || !fileB.open(QIODevice::ReadOnly)) {
57 return false; // can't confirm identical → treat as different
58 }
59 return fileA.readAll() == fileB.readAll();
60}
61
62} // namespace FileUtils
Common logging utilities, the Pandaception error type, and helper macros.
#define PANDACEPTION_WITH_CONTEXT(context, msg,...)
Definition Common.h:102
bool filesHaveSameContent(const QFileInfo &a, const QFileInfo &b)
Definition FileUtils.h:45
void copyToDir(const QString &srcPath, const QString &destDir)
Definition FileUtils.h:17