diff options
author | Daniel Wilhelm <daniel@wili.li> | 2016-03-16 21:34:59 +0100 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2016-03-16 21:34:59 +0100 |
commit | 339ed7f63798fb5ccab05fa7fb9d0d95743c9c89 (patch) | |
tree | 214819f601b69bfd32507ca59047dd4d68ed5632 /zen/file_io.h | |
parent | 7.9 (diff) | |
download | FreeFileSync-339ed7f63798fb5ccab05fa7fb9d0d95743c9c89.tar.gz FreeFileSync-339ed7f63798fb5ccab05fa7fb9d0d95743c9c89.tar.bz2 FreeFileSync-339ed7f63798fb5ccab05fa7fb9d0d95743c9c89.zip |
8.0
Diffstat (limited to 'zen/file_io.h')
-rw-r--r-- | zen/file_io.h | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/zen/file_io.h b/zen/file_io.h index 5bcf4189..261829cd 100644 --- a/zen/file_io.h +++ b/zen/file_io.h @@ -8,6 +8,7 @@ #define FILE_IO_H_89578342758342572345 #include "file_error.h" +#include "serialize.h" #ifdef ZEN_WIN #include "win.h" //includes "windows.h" @@ -54,9 +55,12 @@ public: FileInput(FileHandle handle, const Zstring& filepath); //takes ownership! ~FileInput(); - size_t read(void* buffer, size_t bytesToRead); //throw FileError; returns "bytesToRead", unless end of file! + //Windows: better use 64kB ?? https://technet.microsoft.com/en-us/library/cc938632.aspx + //Linux: use st_blksize? + size_t getBlockSize() const { return 128 * 1024; } + size_t tryRead(void* buffer, size_t bytesToRead); //throw FileError; may return short, only 0 means EOF! => CONTRACT: bytesToRead > 0! + FileHandle getHandle() { return fileHandle; } - size_t optimalBlockSize() const { return 128 * 1024; } private: FileHandle fileHandle; @@ -75,17 +79,39 @@ public: FileOutput(const Zstring& filepath, AccessFlag access); //throw FileError, ErrorTargetExisting FileOutput(FileHandle handle, const Zstring& filepath); //takes ownership! ~FileOutput(); - void close(); //throw FileError -> optional, but good place to catch errors when closing stream! - - void write(const void* buffer, size_t bytesToWrite); //throw FileError - FileHandle getHandle() { return fileHandle; } - size_t optimalBlockSize() const { return 128 * 1024; } FileOutput(FileOutput&& tmp); + size_t getBlockSize() const { return 128 * 1024; } + size_t tryWrite(const void* buffer, size_t bytesToWrite); //throw FileError; may return short! CONTRACT: bytesToWrite > 0 + + void close(); //throw FileError -> optional, but good place to catch errors when closing stream! + FileHandle getHandle() { return fileHandle; } + private: FileHandle fileHandle; }; + + +//native stream I/O convenience functions: + +template <class BinContainer> inline +BinContainer loadBinContainer(const Zstring& filePath, //throw FileError + const std::function<void(std::int64_t bytesDelta)>& notifyProgress) //optional +{ + FileInput streamIn(filePath); //throw FileError, ErrorFileLocked + return unbufferedLoad<BinContainer>(streamIn, notifyProgress); //throw FileError +} + + +template <class BinContainer> inline +void saveBinContainer(const Zstring& filePath, const BinContainer& buffer, //throw FileError + const std::function<void(std::int64_t bytesDelta)>& notifyProgress) //optional +{ + FileOutput fileOut(filePath, FileOutput::ACC_OVERWRITE); // + unbufferedSave(buffer, fileOut, notifyProgress); //throw FileError + fileOut.close(); // +} } #endif //FILE_IO_H_89578342758342572345 |