fs/io/FileOutputStream: add class AppendFileOutputStream
This commit is contained in:
parent
06827cfcf1
commit
7f6e1fbc8d
@ -197,4 +197,59 @@ FileOutputStream::Cancel()
|
|||||||
RemoveFile(GetPath());
|
RemoveFile(GetPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
|
||||||
|
FileOutputStream::FileOutputStream(Path _path, Error &error)
|
||||||
|
:path(_path),
|
||||||
|
handle(CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr,
|
||||||
|
CREATE_ALWAYS,
|
||||||
|
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,
|
||||||
|
nullptr))
|
||||||
|
{
|
||||||
|
if (handle == INVALID_HANDLE_VALUE) {
|
||||||
|
const auto path_utf8 = path.ToUTF8();
|
||||||
|
error.FormatLastError("Failed to create %s",
|
||||||
|
path_utf8.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
AppendFileOutputStream::AppendFileOutputStream(Path _path, Error &error)
|
||||||
|
:BaseFileOutputStream(_path)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
SetHandle(CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,
|
||||||
|
nullptr))
|
||||||
|
if (!IsDefined())
|
||||||
|
error.FormatLastError("Failed to append to %s",
|
||||||
|
GetPath().ToUTF8().c_str());
|
||||||
|
#else
|
||||||
|
if (!SetFD().Open(GetPath().c_str(),
|
||||||
|
O_WRONLY|O_APPEND))
|
||||||
|
error.FormatErrno("Failed to append to %s",
|
||||||
|
GetPath().c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool
|
||||||
|
AppendFileOutputStream::Commit(gcc_unused Error &error)
|
||||||
|
{
|
||||||
|
assert(IsDefined());
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
return Close();
|
||||||
|
#else
|
||||||
|
bool success = Close();
|
||||||
|
if (!success)
|
||||||
|
error.FormatErrno("Failed to commit %s", GetPath().c_str());
|
||||||
|
|
||||||
|
return success;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -135,4 +135,16 @@ public:
|
|||||||
void Cancel();
|
void Cancel();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class AppendFileOutputStream final : public BaseFileOutputStream {
|
||||||
|
public:
|
||||||
|
AppendFileOutputStream(Path _path, Error &error);
|
||||||
|
|
||||||
|
~AppendFileOutputStream() {
|
||||||
|
if (IsDefined())
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Commit(Error &error);
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user