{
private:
std::string filename;
+ bool unlinked;
public:
tmpfstreamTempl()
bool unlink();
- bool move(const std::string& targetpath, bool overwrite);
+ bool is_unlinked()
+ { return unlinked; }
+
+ bool move(const std::string& targetpath, bool overwrite=false);
};
typedef tmpfstreamTempl<bio::file_descriptor_sink> tmpofstream;
template< typename Device, typename Tr, typename Alloc >
bool tmpfstreamTempl<Device,Tr,Alloc>::set_file_mode(int mode)
{
- if (!get_tmp_filename().empty())
+ if (!get_tmp_filename().empty() && !is_unlinked())
return I2n::chmod(get_tmp_filename(),mode);
else
return false;
bool tmpfstreamTempl<Device,Tr,Alloc>::unlink()
{
if (!get_tmp_filename().empty())
- return I2n::unlink(get_tmp_filename());
+ {
+ if (I2n::unlink(get_tmp_filename()))
+ {
+ unlinked=true;
+ return true;
+ }
+ else
+ return false;
+ }
else
return false;
}
bool tmpfstreamTempl<Device,Tr,Alloc>::move(const std::string& targetpath,
bool overwrite)
{
- if (get_tmp_filename().empty())
+ if (get_tmp_filename().empty() || is_unlinked())
return false;
if (overwrite)
unlink(".foobar");
}
+BOOST_AUTO_TEST_CASE(TmpofstreamMoveAfterUnlink)
+{
+ // just to be sure
+ unlink(".foobar");
+
+ tmpofstream tmpf("./tmp.XXXXXX");
+
+ BOOST_CHECK_EQUAL( true, tmpf.is_open() );
+
+ Stat stat(tmpf.get_tmp_filename());
+ BOOST_CHECK_EQUAL( true, (bool)stat );
+ BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
+
+ tmpf << "hello world" << endl;
+ tmpf.flush();
+
+ BOOST_CHECK_EQUAL( true, tmpf.unlink() );
+
+ BOOST_CHECK_EQUAL( true, tmpf.is_unlinked() );
+
+ BOOST_CHECK_EQUAL( false, tmpf.move(".foobar") );
+
+ unlink(".foobar");
+}
+
BOOST_AUTO_TEST_CASE(TmpfstreamReadWrite)
{
tmpfstream tmpf("./tmp.XXXXXX",std::ios_base::out | std::ios_base::in );