-
Notifications
You must be signed in to change notification settings - Fork 1
/
FileInfo.h
67 lines (56 loc) · 1.61 KB
/
FileInfo.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
#include "FileIO.h"
struct FileInfo
{
FileInfo(const wchar_t* fn)
: filename(fn)
, exists(_wstati64(filename, &stat) == 0)
, bom(BOM_NONE)
{
if (exists && (stat.st_mode & S_IFDIR) != 0)
throw std::exception("Can't edit directory");
if (exists && (stat.st_mode & S_IFREG) == 0)
throw std::exception("Can't edit non-file");
}
bool changed(bool &modeChanged)
{
struct _stat64 newStat;
bool newExists(_wstati64(filename, &newStat) == 0);
modeChanged = stat.st_mode != newStat.st_mode;
stat.st_mode = newStat.st_mode;
return (newExists && (!exists || stat.st_mtime != newStat.st_mtime));
}
bool isreadonly() const
{
return exists && (stat.st_mode & _S_IWRITE) == 0;
}
std::vector<wchar_t> load()
{
exists = _wstati64(filename, &stat) == 0;
std::vector<wchar_t> chars = loadtextfile(filename, bom);
chars.pop_back(); // Remove null terminator
return chars;
}
void save(std::vector<wchar_t>& chars)
{
struct TempPushBack
{
TempPushBack(std::vector<wchar_t>& v, wchar_t c)
: v(v)
{
v.push_back(c);
}
~TempPushBack()
{
v.pop_back();
}
std::vector<wchar_t>& v;
};
TempPushBack tpb(chars, L'\0');
savetextfile(filename, bom, chars);
exists = _wstati64(filename, &stat) == 0;
}
const wchar_t* filename;
struct _stat64 stat;
bool exists;
BOM bom;
};