readwritefile.cpp raw

   1  // Copyright (c) 2015-2022 The Limenka 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 <limits>
  13  #include <string>
  14  #include <utility>
  15  
  16  std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxsize)
  17  {
  18      FILE *f = fsbridge::fopen(filename, "rb");
  19      if (f == nullptr)
  20          return std::make_pair(false,"");
  21      std::string retval;
  22      char buffer[128];
  23      do {
  24          const size_t n = fread(buffer, 1, std::min(sizeof(buffer), maxsize - retval.size()), f);
  25          // Check for reading errors so we don't return any data if we couldn't
  26          // read the entire file (or up to maxsize)
  27          if (ferror(f)) {
  28              fclose(f);
  29              return std::make_pair(false,"");
  30          }
  31          retval.append(buffer, buffer+n);
  32      } while (!feof(f) && retval.size() < maxsize);
  33      fclose(f);
  34      return std::make_pair(true,retval);
  35  }
  36  
  37  bool WriteBinaryFile(const fs::path &filename, const std::string &data)
  38  {
  39      FILE *f = fsbridge::fopen(filename, "wb");
  40      if (f == nullptr)
  41          return false;
  42      if (fwrite(data.data(), 1, data.size(), f) != data.size()) {
  43          fclose(f);
  44          return false;
  45      }
  46      if (fclose(f) != 0) {
  47          return false;
  48      }
  49      return true;
  50  }
  51