X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FFileUtil.h;h=5adcd62d6c0df6a869c1d8aecb37a6fca3833132;hb=59527d6ae3453d12190f38762637c0fd19b6abd7;hp=2679f928f1add40886c1e3dfb0b1fe1a23134d08;hpb=ce64f0f685111ac24c7a321ea56d0c3524621df1;p=folly.git diff --git a/folly/FileUtil.h b/folly/FileUtil.h index 2679f928..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. @@ -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_ */