| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include "util/file_util.h" |
| |
| #include <fstream> |
| #include <streambuf> |
| #include <string> |
| |
| #include "./logging.h" |
| #include "util/status.h" |
| #include "util/status_codes.h" |
| |
| namespace cobalt { |
| namespace util { |
| namespace { |
| static const int kMaxFileSize = 100000; |
| } |
| |
| statusor::StatusOr<std::string> ReadTextFile(const std::string& file_path) { |
| std::string file_contents; |
| if (file_path.empty()) { |
| return Status(INVALID_ARGUMENT, "ReadTextFile: file_path is empty."); |
| } |
| std::ifstream stream(file_path, std::ifstream::in); |
| if (!stream.good()) { |
| return Status(NOT_FOUND, "Unable to open file at " + file_path); |
| } |
| stream.seekg(0, std::ios::end); |
| if (!stream.good()) { |
| return Status(INTERNAL, "Error reading file at " + file_path); |
| } |
| auto file_size = stream.tellg(); |
| if (file_size == 0) { |
| return std::string(""); |
| } |
| // Don't try to read a file that's too big. |
| if (!stream.good() || file_size < 0 || file_size > kMaxFileSize) { |
| return Status(FAILED_PRECONDITION, "Invalid file length for " + file_path); |
| } |
| file_contents.reserve(file_size); |
| |
| stream.seekg(0, std::ios::beg); |
| if (!stream.good()) { |
| return Status(NOT_FOUND, "Error reading file at " + file_path); |
| } |
| file_contents.assign((std::istreambuf_iterator<char>(stream)), |
| std::istreambuf_iterator<char>()); |
| if (!stream.good()) { |
| return Status(NOT_FOUND, "Error reading file at " + file_path); |
| } |
| VLOG(3) << "Successfully read file at " << file_path; |
| return file_contents; |
| } |
| |
| statusor::StatusOr<std::string> ReadNonEmptyTextFile( |
| const std::string& file_path) { |
| auto read_file_result = ReadTextFile(file_path); |
| if (!read_file_result.ok()) { |
| return read_file_result; |
| } |
| |
| if (read_file_result.ValueOrDie().empty()) { |
| return Status(FAILED_PRECONDITION, "File was empty: " + file_path); |
| } |
| |
| return read_file_result; |
| } |
| |
| } // namespace util |
| } // namespace cobalt |