-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathfile_utilities.h
158 lines (133 loc) · 3.45 KB
/
file_utilities.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef FILE_UTILITIES_H
#define FILE_UTILITIES_H
#include <QDebug>
#include <QFileInfo>
#include <QFile>
#include <QBuffer>
#include <QByteArray>
#include <QTextCodec>
#include <QTextStream>
///////////////////////////////////////////////////////////
class _CTextFile{
private:
QString m_sFn;
public:
static QString codecName(const QByteArray& vBuf, bool bHtml=false)
{
QString sName;
QTextCodec* pDef=QTextCodec::codecForLocale();
QTextCodec* p=bHtml ? QTextCodec::codecForHtml(vBuf, pDef) : QTextCodec::codecForUtfText(vBuf, pDef);
if(p){
QByteArray v=p->name();
sName=v;
//qDebug() << "->detectCodecName: " << sName;
}
return sName;
}
///////////////////////////////////////////////////
static QString load(QIODevice& xIO, const QString& sCodec="")
{
QString sTxt;
try{
QTextStream ts(&xIO);
if(!sCodec.isEmpty() && sCodec!="System") ts.setCodec(sCodec.toStdString().c_str());
sTxt=ts.readAll();
}catch(...){
qDebug() << "**Error loading text. sCodec=" << sCodec;
}
return sTxt;
}
static QString load(const QByteArray& vBuf, const QString& sDefCodec)
{
QString sTxt, sCodec=sDefCodec;
if(sCodec.isEmpty() || sCodec.toLower()=="auto") sCodec=codecName(vBuf); //auto-detect codec if necessary;
QBuffer b; b.setData(vBuf);
if(b.open(QIODevice::ReadOnly)){
sTxt=load((QIODevice&)b, sCodec);
}
return sTxt;
}
static QString load(const QString& sFn, const QString& sDefCodec)
{
QString sTxt;
{
// qDebug() << "->loadTextFile(sFn=" << sFn << ", sCodec=" << sDefCodec << ")";
QFile f(sFn);
if(f.open(QIODevice::ReadOnly|QIODevice::Text)){
int nLen=f.size();
if(nLen>0){
QByteArray v=f.read(nLen);
sTxt=load(v, sDefCodec);
}
f.close();
}
}
return sTxt;
}
///////////////////////////////////////////////////
static bool save(QIODevice& xIO, const QString& sTxt, const QString& sCodec)
{
bool bSucc=false;
try{
QTextStream ts(&xIO);
if(!sCodec.isEmpty()) ts.setCodec(sCodec.toStdString().c_str());
ts << sTxt;
bSucc=true;
}catch(...){
}
return bSucc;
}
static qint64 save(const QString& sFn, const QString& sTxt, const QString& sCodec)
{
qint64 nBytes=-1;
QFile f(sFn);
if(f.open(QIODevice::WriteOnly|QIODevice::Truncate|QIODevice::Text)){
if(save(f, sTxt, sCodec)){
nBytes=f.size();
}
f.close();
}
return nBytes;
}
static qint64 saveAnsi(const QString& sFn, const QString& sTxt)
{
QTextCodec* pDef=QTextCodec::codecForLocale();
return save(sFn, sTxt, pDef ? pDef->name() : "");
}
static qint64 saveUtf8(const QString& sFn, const QString& sTxt, bool bBOM)
{
qint64 nBytes=-1;
QFile f(sFn);
if(f.open(QIODevice::WriteOnly|QIODevice::Truncate)){
const char* _BOM_UTF8="\xEF\xBB\xBF";
QByteArray v; if(bBOM) v.append(_BOM_UTF8);
v.append(sTxt.toUtf8());
f.write(v);
nBytes=f.size();
f.close();
}
return nBytes;
}
///////////////////////////////////////////////////
public:
_CTextFile(const QString& sFn) : m_sFn(sFn){return;}
QString fileName(void)const{return m_sFn;}
void fileName(const QString& sFn){m_sFn=sFn;}
QString load(const QString& sCodec)const
{
return load(m_sFn, sCodec);
}
qint64 save(const QString& sTxt, const QString& sCodec)const
{
return save(m_sFn, sTxt, sCodec);
}
qint64 saveAnsi(const QString& sTxt)const
{
return saveAnsi(m_sFn, sTxt);
}
qint64 saveUtf8(const QString& sTxt, bool bBOM)const
{
return saveUtf8(m_sFn, sTxt, bBOM);
}
};
#endif // FILE_UTILITIES_H