X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FFileUtil.h;h=5adcd62d6c0df6a869c1d8aecb37a6fca3833132;hb=59527d6ae3453d12190f38762637c0fd19b6abd7;hp=4eb56df37775215fc235434405a0bde37afcde65;hpb=300f64f9e5414ac5147b4b86c3c16822ec78b49d;p=folly.git diff --git a/folly/FileUtil.h b/folly/FileUtil.h index 4eb56df3..5adcd62d 100644 --- a/folly/FileUtil.h +++ b/folly/FileUtil.h @@ -1,5 +1,5 @@ /* - * Copyright 2014 Facebook, Inc. + * Copyright 2015 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,9 @@ #ifndef FOLLY_FILEUTIL_H_ #define FOLLY_FILEUTIL_H_ -#include "folly/Conv.h" -#include "folly/Portability.h" -#include "folly/ScopeGuard.h" +#include +#include +#include #include #include @@ -166,6 +166,32 @@ bool readFile(const char* file_name, Container& out, return true; } +/** + * Writes container to file. The container is assumed to be + * contiguous, with element size equal to 1, and offering STL-like + * methods empty(), size(), and indexed access + * (e.g. std::vector, std::string, fbstring, StringPiece). + * + * "flags" dictates the open flags to use. Default is to create file + * if it doesn't exist and truncate it. + * + * Returns: true on success or false on failure. In the latter case + * errno will be set appropriately by the failing system primitive. + */ +template +bool writeFile(const Container& data, const char* filename, + int flags = O_WRONLY | O_CREAT | O_TRUNC) { + static_assert(sizeof(data[0]) == 1, + "writeFile works with element size equal to 1"); + int fd = open(filename, flags, 0666); + if (fd == -1) { + return false; + } + bool ok = data.empty() || + writeFull(fd, &data[0], data.size()) == static_cast(data.size()); + return closeNoInt(fd) == 0 && ok; +} + } // namespaces #endif /* FOLLY_FILEUTIL_H_ */