Index: /trunk/include/iprt/mangling.h
===================================================================
--- /trunk/include/iprt/mangling.h	(revision 84145)
+++ /trunk/include/iprt/mangling.h	(revision 84146)
@@ -2712,4 +2712,6 @@
 # define RTVfsFileOpenNormal                            RT_MANGLER(RTVfsFileOpenNormal)
 # define RTVfsFilePoll                                  RT_MANGLER(RTVfsFilePoll)
+# define RTVfsFilePrintf                                RT_MANGLER(RTVfsFilePrintf)
+# define RTVfsFilePrintfV                               RT_MANGLER(RTVfsFilePrintfV)
 # define RTVfsFileQueryInfo                             RT_MANGLER(RTVfsFileQueryInfo)
 # define RTVfsFileQueryMaxSize                          RT_MANGLER(RTVfsFileQueryMaxSize)
@@ -2749,4 +2751,6 @@
 # define RTVfsIoStrmOpenNormal                          RT_MANGLER(RTVfsIoStrmOpenNormal)
 # define RTVfsIoStrmPoll                                RT_MANGLER(RTVfsIoStrmPoll)
+# define RTVfsIoStrmPrintf                              RT_MANGLER(RTVfsIoStrmPrintf)
+# define RTVfsIoStrmPrintfV                             RT_MANGLER(RTVfsIoStrmPrintfV)
 # define RTVfsIoStrmQueryInfo                           RT_MANGLER(RTVfsIoStrmQueryInfo)
 # define RTVfsIoStrmRead                                RT_MANGLER(RTVfsIoStrmRead)
Index: /trunk/include/iprt/vfs.h
===================================================================
--- /trunk/include/iprt/vfs.h	(revision 84145)
+++ /trunk/include/iprt/vfs.h	(revision 84146)
@@ -1207,4 +1207,26 @@
 /** @}  */
 
+/**
+ * Printf-like write function.
+ *
+ * @returns Number of characters written on success, negative error status on
+ *          failure.
+ * @param   hVfsIos         The VFS I/O stream handle to write to.
+ * @param   pszFormat       The format string.
+ * @param   ...             Format arguments.
+ */
+RTDECL(ssize_t)     RTVfsIoStrmPrintf(RTVFSIOSTREAM hVfsIos, const char *pszFormat, ...);
+
+/**
+ * Printf-like write function.
+ *
+ * @returns Number of characters written on success, negative error status on
+ *          failure.
+ * @param   hVfsIos         The VFS I/O stream handle to write to.
+ * @param   pszFormat       The format string.
+ * @param   va              Format arguments.
+ */
+RTDECL(ssize_t)     RTVfsIoStrmPrintfV(RTVFSIOSTREAM hVfsIos, const char *pszFormat, va_list va);
+
 /** @} */
 
@@ -1484,4 +1506,26 @@
 RTDECL(uint64_t)    RTVfsFileGetOpenFlags(RTVFSFILE hVfsFile);
 
+/**
+ * Printf-like write function.
+ *
+ * @returns Number of characters written on success, negative error status on
+ *          failure.
+ * @param   hVfsFile        The VFS file handle to write to.
+ * @param   pszFormat       The format string.
+ * @param   ...             Format arguments.
+ */
+RTDECL(ssize_t)     RTVfsFilePrintf(RTVFSFILE hVfsFile, const char *pszFormat, ...);
+
+/**
+ * Printf-like write function.
+ *
+ * @returns Number of characters written on success, negative error status on
+ *          failure.
+ * @param   hVfsFile        The VFS file handle to write to.
+ * @param   pszFormat       The format string.
+ * @param   va              Format arguments.
+ */
+RTDECL(ssize_t)     RTVfsFilePrintfV(RTVFSFILE hVfsFile, const char *pszFormat, va_list va);
+
 /** @} */
 
Index: /trunk/src/VBox/Runtime/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Runtime/Makefile.kmk	(revision 84145)
+++ /trunk/src/VBox/Runtime/Makefile.kmk	(revision 84146)
@@ -675,4 +675,5 @@
 	common/vfs/vfsstdfile.cpp \
 	common/vfs/vfsstdpipe.cpp \
+	common/vfs/vfsprintf.cpp \
 	common/zip/tar.cpp \
 	common/zip/tarcmd.cpp \
Index: /trunk/src/VBox/Runtime/common/vfs/vfsprintf.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/vfs/vfsprintf.cpp	(revision 84146)
+++ /trunk/src/VBox/Runtime/common/vfs/vfsprintf.cpp	(revision 84146)
@@ -0,0 +1,150 @@
+/* $Id$ */
+/** @file
+ * IPRT - Virtual File System, File Printf.
+ */
+
+/*
+ * Copyright (C) 2010-2020 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#include <iprt/vfs.h>
+
+#include <iprt/err.h>
+#include <iprt/mem.h>
+#include <iprt/string.h>
+
+
+/*********************************************************************************************************************************
+*   Structures and Typedefs                                                                                                      *
+*********************************************************************************************************************************/
+typedef struct PRINTFBUF
+{
+    RTVFSIOSTREAM   hVfsIos;
+    int             rc;
+    size_t          offBuf;
+    char            szBuf[256];
+} PRINTFBUF;
+
+
+/** Writes the buffer to the VFS file. */
+static void FlushPrintfBuffer(PRINTFBUF *pBuf)
+{
+    if (pBuf->offBuf)
+    {
+        int rc = RTVfsIoStrmWrite(pBuf->hVfsIos, pBuf->szBuf, pBuf->offBuf, true /*fBlocking*/, NULL);
+        if (RT_FAILURE(rc))
+            pBuf->rc = rc;
+        pBuf->offBuf   = 0;
+        pBuf->szBuf[0] = '\0';
+    }
+}
+
+
+/** @callback_method_impl{FNRTSTROUTPUT} */
+static DECLCALLBACK(size_t) MyPrintfOutputter(void *pvArg, const char *pachChars, size_t cbChars)
+{
+    PRINTFBUF *pBuf = (PRINTFBUF *)pvArg;
+    if (cbChars != 0)
+    {
+        size_t offSrc = 0;
+        while  (offSrc < cbChars)
+        {
+            size_t cbLeft = sizeof(pBuf->szBuf) - pBuf->offBuf - 1;
+            if (cbLeft > 0)
+            {
+                size_t cbToCopy = RT_MIN(cbChars - offSrc, cbLeft);
+                memcpy(&pBuf->szBuf[pBuf->offBuf], &pachChars[offSrc], cbToCopy);
+                pBuf->offBuf += cbToCopy;
+                pBuf->szBuf[pBuf->offBuf] = '\0';
+                if (cbLeft > cbToCopy)
+                    break;
+                offSrc += cbToCopy;
+            }
+            FlushPrintfBuffer(pBuf);
+        }
+    }
+    else /* Special zero byte write at the end of the formatting. */
+        FlushPrintfBuffer(pBuf);
+    return cbChars;
+}
+
+
+
+RTDECL(ssize_t) RTVfsIoStrmPrintfV(RTVFSIOSTREAM hVfsIos, const char *pszFormat, va_list va)
+{
+    PRINTFBUF Buf;
+    Buf.hVfsIos  = hVfsIos;
+    Buf.rc       = VINF_SUCCESS;
+    Buf.offBuf   = 0;
+    Buf.szBuf[0] = '\0';
+
+    size_t cchRet = RTStrFormatV(MyPrintfOutputter, &Buf, NULL, NULL, pszFormat, va);
+    if (RT_SUCCESS(Buf.rc))
+        return cchRet;
+    return Buf.rc;
+}
+
+
+RTDECL(ssize_t) RTVfsIoStrmPrintf(RTVFSIOSTREAM hVfsIos, const char *pszFormat, ...)
+{
+    va_list va;
+    va_start(va, pszFormat);
+    ssize_t cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va);
+    va_end(va);
+    return cchRet;
+}
+
+
+RTDECL(ssize_t) RTVfsFilePrintfV(RTVFSFILE hVfsFile, const char *pszFormat, va_list va)
+{
+    ssize_t cchRet;
+    RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile);
+    if (hVfsIos != NIL_RTVFSIOSTREAM)
+    {
+        cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va);
+        RTVfsIoStrmRelease(hVfsIos);
+    }
+    else
+        cchRet = VERR_INVALID_HANDLE;
+    return cchRet;
+}
+
+
+RTDECL(ssize_t) RTVfsFilePrintf(RTVFSFILE hVfsFile, const char *pszFormat, ...)
+{
+    ssize_t cchRet;
+    RTVFSIOSTREAM hVfsIos = RTVfsFileToIoStream(hVfsFile);
+    if (hVfsIos != NIL_RTVFSIOSTREAM)
+    {
+        va_list va;
+        va_start(va, pszFormat);
+        cchRet = RTVfsIoStrmPrintfV(hVfsIos, pszFormat, va);
+        va_end(va);
+        RTVfsIoStrmRelease(hVfsIos);
+    }
+    else
+        cchRet = VERR_INVALID_HANDLE;
+    return cchRet;
+}
+
