Index: cpp/common/virtfile/stdiofile.cpp
===================================================================
--- cpp/common/virtfile/stdiofile.cpp	(revision 1038)
+++ cpp/common/virtfile/stdiofile.cpp	(revision 1328)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2018  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -11,4 +11,11 @@
 #include <common/dirs.h>
 #include <common/platform/android/AndroidAPK_DIR.h>
+#endif
+#include <sys/stat.h>
+#include <unistd.h>
+#ifdef _WIN32
+#include <sys/utime.h>
+#else
+#include <utime.h>
 #endif
 
@@ -74,8 +81,49 @@
 }
 
+bool StdioFileSystem::Vdelete(const char* path)
+{
+	return removeFile(path);
+}
 
+bool StdioFileSystem::Vstat(const char* path, Stat* out)
+{
+#ifdef _WIN32
+	//under windows, there are a few choices of _statXX structures: 32bit, 64bit, ansi, widechar (and their corresponding _statXX() functions). For the future: ensure utf8 filenames work.
+	using stat = struct _stat64i32; //"struct" because there is also a function with the same name
+	//struct _stat64i32 info; //an alternative, simple way if one does not want to use "using" above
+#else
+	struct //if there was "using" earlier, then we cannot use "struct" in type name
+#endif
+	stat info;
+	if (_stat(path, &info) != 0) return false;
+	out->is_file = S_ISREG(info.st_mode);
+#if defined IPHONE && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
+	out->modification_time = info.st_mtimespec.tv_sec;
+#else
+	out->modification_time = info.st_mtime;
+#endif
+	return true;
+}
 
-
-
+bool StdioFileSystem::Vsettime(const char* path, double timestamp)
+{
+#ifdef _WIN32
+	//under windows, there are a few choices of _statXX structures: 32bit, 64bit, ansi, widechar (and their corresponding _statXX() functions). For the future: ensure utf8 filenames work.
+	using stat = struct _stat64i32; //"struct" because there is also a function with the same name
+	//struct _stat64i32 info; //an alternative, simple way if one does not want to use "using" above
+#else
+	struct //if there was "using" earlier, then we cannot use "struct" in type name
+#endif
+	stat info;
+	if (_stat(path, &info) != 0) return false;
+	struct utimbuf times;
+#if defined IPHONE && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))
+	times.actime = info.st_atimespec.tv_sec;
+#else
+	times.actime = info.st_atime;
+#endif
+	times.modtime = (time_t)timestamp;
+	return utime(path, &times) == 0;
+}
 
 #ifndef NO_STD_IN_OUT_ERR
Index: cpp/common/virtfile/stdiofile.h
===================================================================
--- cpp/common/virtfile/stdiofile.h	(revision 1038)
+++ cpp/common/virtfile/stdiofile.h	(revision 1328)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2018  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -18,4 +18,7 @@
 	bool Vmkdir(const char* path) { return makeDirectory(path); }
 	bool Vdirexists(const char* path, bool is_writable);
+	bool Vdelete(const char* path);
+	bool Vstat(const char* path, Stat* stat);
+	bool Vsettime(const char* path, double timestamp);
 };
 
Index: cpp/common/virtfile/virtfile.cpp
===================================================================
--- cpp/common/virtfile/virtfile.cpp	(revision 1038)
+++ cpp/common/virtfile/virtfile.cpp	(revision 1328)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -50,4 +50,18 @@
 }
 
+bool Vdelete(const char* path)
+{
+	return VirtFILE::vfs ? VirtFILE::vfs->Vdelete(path) : false;
+}
+
+bool Vstat(const char* path, struct VirtFileSystem::Stat *stat)
+{
+	return VirtFILE::vfs ? VirtFILE::vfs->Vstat(path, stat) : false;
+}
+
+bool Vsettime(const char* path, double timestamp)
+{
+	return VirtFILE::vfs ? VirtFILE::vfs->Vsettime(path, timestamp) : false;
+}
 VirtFILE::~VirtFILE()
 {}
@@ -99,4 +113,7 @@
 bool VirtFileSystem::Vmkdir(const char* path) { return false; }
 bool VirtFileSystem::Vdirexists(const char* path, bool is_writable) { return false; }
+bool VirtFileSystem::Vdelete(const char* path) { return false; }
+bool VirtFileSystem::Vstat(const char* path, Stat* stat) { return false; }
+bool VirtFileSystem::Vsettime(const char* path, double timestamp) { return false; }
 
 //////////////////////////////////////////////////////////////////////////
@@ -206,4 +223,19 @@
 {
 	return (chain != NULL) ? chain->Vdirexists(path, is_writable) : false;
+}
+
+bool ChainFileSystem::Vdelete(const char* path)
+{
+	return (chain != NULL) ? chain->Vdelete(path) : false;
+}
+
+bool ChainFileSystem::Vstat(const char* path, Stat* stat)
+{
+	return (chain != NULL) ? chain->Vstat(path, stat) : false;
+}
+
+bool ChainFileSystem::Vsettime(const char* path, double timestamp)
+{
+	return (chain != NULL) ? chain->Vsettime(path, timestamp) : false;
 }
 
Index: cpp/common/virtfile/virtfile.h
===================================================================
--- cpp/common/virtfile/virtfile.h	(revision 1038)
+++ cpp/common/virtfile/virtfile.h	(revision 1328)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2019  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -98,4 +98,8 @@
 	virtual bool Vmkdirs(const char* path);
 	virtual bool Vdirexists(const char* path, bool is_writable);
+	virtual bool Vdelete(const char* path);
+	struct Stat { bool is_file; time_t modification_time; };
+	virtual bool Vstat(const char* path, Stat* stat);
+	virtual bool Vsettime(const char* path, double timestamp);
 };
 
@@ -113,4 +117,7 @@
 	bool Vmkdirs(const char* path);
 	bool Vdirexists(const char* path, bool is_writable);
+	bool Vdelete(const char* path);
+	bool Vstat(const char* path, Stat* stat);
+	bool Vsettime(const char* path, double timestamp);
 
 	class Dir : public VirtDIR
@@ -135,4 +142,7 @@
 DLLEXP bool Vmkdirs(const char* path);
 DLLEXP bool Vdirexists(const char* path, bool is_writable);
+DLLEXP bool Vdelete(const char* path);
+DLLEXP bool Vstat(const char* path, struct VirtFileSystem::Stat *stat);
+DLLEXP bool Vsettime(const char* path, double timestamp);
 
 #ifdef VIRTFILE_OVERLOADING
