Sandboxie/SandboxiePlus/MiscHelpers/Common/OtherFunctions.cpp

197 lines
4.5 KiB
C++

#include "stdafx.h"
#include "OtherFunctions.h"
//////////////////////////////////////////////////////////////////////////////////////////
// File system functions
//
QString ReadFileAsString(const QString& filename)
{
QFile file(filename);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream stream(&file);
QString content = stream.readAll();
file.close();
content.remove("\r").replace("\n","\r\n");
return content;
}
return "";
}
bool WriteStringToFile(const QString& filename, const QString& content)
{
QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
QTextStream out(&file);
out << QString(content).remove("\r");
file.close();
return true;
}
bool CreateDir(const QString& path)
{
QDir dir(path);
if (dir.exists())
return true;
return dir.mkpath(path);
}
bool DeleteDir(const QString& path, bool bEmpty)
{
bool error = false;
QDir delDir(path);
QStringList fileNames = delDir.entryList();
foreach (const QString& name, fileNames)
{
if (name.compare(".") == 0 || name.compare("..") == 0)
continue;
QString src = path;
src = src.append("/%1").arg(name);
QFileInfo srcInfo(src);
if (srcInfo.isDir())
{
if(!DeleteDir(src, bEmpty))
error = true;
}
else if(bEmpty)
error = true;
else
{
if(!QFile::remove(src))
error = true;
}
}
if (!error)
{
if(!QDir().rmdir(path))
error = true;
}
return !error;
}
bool CopyDir(const QString& srcDirPath, const QString& destDirPath, bool bMove)
{
QDir srcDir(srcDirPath);
if (!srcDir.exists())
return false;
QDir destDir(destDirPath);
if (!destDir.exists() && !destDir.mkdir(destDirPath))
return false;
QStringList fileNames = srcDir.entryList();
foreach (const QString& name, fileNames)
{
if (name.compare(".") == 0 || name.compare("..") == 0)
continue;
QString src = srcDirPath;
src = src + "/" + name;
QString dst = destDirPath;
QFileInfo srcInfo(src);
if (srcInfo.isDir())
{
dst = dst.append("/" + srcInfo.baseName());
CopyDir(src, dst, bMove);
}
else
{
dst = dst.append("/%1").arg(name);
if(bMove)
QFile::rename(src, dst);
else
QFile::copy(src, dst);
}
}
if(bMove)
QDir().rmdir(srcDirPath);
return true;
}
QStringList ListDir(const QString& srcDirPath, const QStringList& NameFilter, bool bAndSubDirs)
{
QStringList FileList;
QDir srcDir(srcDirPath);
if (!srcDir.exists())
return FileList;
QStringList Files = !NameFilter.isEmpty() ? srcDir.entryList(NameFilter, QDir::Files | QDir::Hidden | QDir::System) : srcDir.entryList(QDir::Files | QDir::Hidden | QDir::System);
foreach (const QString& FileName, Files)
FileList.append(FileName);
if(!bAndSubDirs)
return FileList;
QStringList Dirs = srcDir.entryList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);
foreach (const QString& DirName, Dirs)
{
//if (DirName.compare(".") == 0 || DirName.compare("..") == 0)
// continue;
QStringList SubFiles = ListDir(srcDirPath + "/" + DirName, NameFilter);
foreach (const QString& FileName, SubFiles)
FileList.append(DirName + "/" + FileName);
}
return FileList;
}
bool SafeRemove(const QString& FilePath)
{
bool bRemoved = false;
for(int i=0; i < 100; i++) // try for 10 sec
{
bRemoved = QFile::remove(FilePath);
if(bRemoved)
break;
QThread::currentThread()->msleep(100);
}
return bRemoved;
}
QString GetRelativeSharedPath(const QString& fullPath, const QStringList& shared, QString& rootPath)
{
QString relativePath = fullPath;
bool bFound = false;
foreach (QString curShared, shared)
{
curShared = curShared.replace("\\", "/");
int length = curShared.length();
if (length == 0)
continue;
QFileInfo fileInfo = QFileInfo(fullPath);
if (!fileInfo.isDir())
{
QString curDir = curShared.left(curShared.lastIndexOf('/'));
length = curDir.length();
if (fullPath.left(length).compare(curDir) == 0) {
rootPath = relativePath.left(length+1);
relativePath.remove(0, length+1);
return relativePath;
}
}
else
{
if (fullPath.left(length).compare(curShared) == 0) {
rootPath = relativePath.left(length);
relativePath.remove(0, length);
return relativePath;
}
}
}
int length = relativePath.lastIndexOf("/");
rootPath = relativePath.left(length+1);
relativePath.remove(0, length+1);
return relativePath;
}
QString NameOfFile(const QString& FileName)
{
int Begin = FileName.lastIndexOf("/") + 1;
int End = FileName.lastIndexOf(".");
if(End!= -1)
return FileName.mid(Begin, End - Begin);
return FileName.mid(Begin);
}