readwritefile.cpp raw
1 // Copyright (c) 2015-present The Bitcoin Core developers
2 // Copyright (c) 2017 The Zcash developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6 #include <util/readwritefile.h>
7
8 #include <util/fs.h>
9
10 #include <algorithm>
11 #include <cstdio>
12 #include <string>
13 #include <utility>
14
15 std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize)
16 {
17 FILE *f = fsbridge::fopen(filename, "rb");
18 if (f == nullptr)
19 return std::make_pair(false,"");
20 std::string retval;
21 char buffer[128];
22 do {
23 const size_t n = fread(buffer, 1, std::min(sizeof(buffer), maxsize - retval.size()), f);
24 // Check for reading errors so we don't return any data if we couldn't
25 // read the entire file (or up to maxsize)
26 if (ferror(f)) {
27 fclose(f);
28 return std::make_pair(false,"");
29 }
30 retval.append(buffer, buffer+n);
31 } while (!feof(f) && retval.size() < maxsize);
32 fclose(f);
33 return std::make_pair(true,retval);
34 }
35
36 bool WriteBinaryFile(const fs::path &filename, const std::string &data)
37 {
38 FILE *f = fsbridge::fopen(filename, "wb");
39 if (f == nullptr)
40 return false;
41 if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
42 fclose(f);
43 return false;
44 }
45 if (fclose(f) != 0) {
46 return false;
47 }
48 return true;
49 }
50