X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Ffilesystem%2Fhuge_file.cpp;h=ae8382950965b9232c1a2150add1fd5c55070a1b;hb=refs%2Fheads%2Frelease-2.140.92;hp=4c218c56673b1b4be612ca6e5bc64c29f2124006;hpb=3ea085ec301ed1399dfa1e9f3a240312dc95410b;p=feisty_meow.git diff --git a/nucleus/library/filesystem/huge_file.cpp b/nucleus/library/filesystem/huge_file.cpp index 4c218c56..ae838295 100644 --- a/nucleus/library/filesystem/huge_file.cpp +++ b/nucleus/library/filesystem/huge_file.cpp @@ -20,6 +20,11 @@ #include #include +#ifndef __WIN32__ + #include +#else + #include +#endif #undef LOG #define LOG(to_print) printf("%s::%s: %s\n", static_class_name(), func, astring(to_print).s()) @@ -42,6 +47,8 @@ huge_file::~huge_file() WHACK(_real_file); } +const astring &huge_file::name() const { return _real_file->name(); } + void huge_file::flush() { _real_file->flush(); } bool huge_file::truncate() { return _real_file->truncate(); } @@ -124,7 +131,7 @@ double huge_file::length() // something malfunctioned. we should always be able to get back to // the last good size we found if the file is static. LOG(a_sprintf("failed to seek back to best highest %.0f on ", - best_highest) + _real_file->filename()); + best_highest) + _real_file->name()); // try to repair our ideas about the file by starting the process // over. //hmmm: count the number of times restarted and bail after N. @@ -134,7 +141,7 @@ double huge_file::length() // the heck with this. we can't even go back to the start. this // file seems to be screwed up now. LOG(astring("failed to seek back to start of file! on ") - + _real_file->filename()); + + _real_file->name()); return 0; } // reset the rest of the positions for our failed attempt to return @@ -254,7 +261,7 @@ outcome huge_file::seek(double new_position, byte_filer::origins origin) outcome huge_file::read(byte_array &to_fill, int desired_size, int &size_read) { -// FUNCDEF("read"); + FUNCDEF("read"); size_read = 0; int ret = _real_file->read(to_fill, desired_size); if (ret < 0) @@ -266,7 +273,7 @@ outcome huge_file::read(byte_array &to_fill, int desired_size, int &size_read) outcome huge_file::write(const byte_array &to_write, int &size_written) { -// FUNCDEF("write"); + FUNCDEF("write"); size_written = 0; int ret = _real_file->write(to_write); if (ret < 0) @@ -276,5 +283,44 @@ outcome huge_file::write(const byte_array &to_write, int &size_written) return OKAY; } +basis::outcome huge_file::touch() +{ + FUNCDEF("touch") + if (filename(_real_file->name()).exists()) { + // file exists, so just update time. +#ifndef __WIN32__ + int ret = utimes(_real_file->name().observe(), NULL_POINTER); + if (ret != 0) + return FAILURE; +#else + // open the file, although the function says create in its name... + HANDLE f = CreateFile(_real_file->name().observe(), + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL_POINTER, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL_POINTER); + if (!f) { + LOG(a_sprintf("failed to open file %s", _real_file->name().observe())); + return FAILURE; + } + // get current system time in UTC. + SYSTEMTIME *st = new SYSTEMTIME; + GetSystemTime(st); + // convert system time into file time. + FILETIME *t = new FILETIME; + SystemTimeToFileTime(st, t); + // set the file's time. + SetFileTime(f, NULL_POINTER, t, t); +#endif + } else { + // file doesn't exist yet. + byte_array junk(1); + int written; + outcome ret = write(junk, written); + if (ret != OKAY) ret; + if (!truncate()) + return FAILURE; + } + return OKAY; +} + } //namespace.