Significantly improved performance of directory scans of full NTFS
volumes on Windows 8 and later.
+ On Windows, to improve capture performance, wimlib now sometimes opens
+ files by inode number rather than by path. This is enabled for
+ wimcapture and wimappend, but for now other applications have to opt-in.
+
The progress messages printed by wimlib-imagex while writing WIM files
have been slightly tweaked.
*/
#define WIMLIB_ADD_FLAG_SNAPSHOT 0x00008000
+/**
+ * Permit the library to discard file paths after the initial scan. If the
+ * application won't use WIMLIB_WRITE_FLAG_SEND_DONE_WITH_FILE_MESSAGES while
+ * writing the WIM archive, this flag can be used to allow the library to enable
+ * optimizations such as opening files by inode number rather than by path.
+ * Currently this only makes a difference on Windows.
+ */
+#define WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED 0x00010000
+
/** @} */
/** @addtogroup G_modifying_wims
* @{ */
WIMLIB_ADD_FLAG_WIMBOOT |
WIMLIB_ADD_FLAG_NO_REPLACE |
WIMLIB_ADD_FLAG_TEST_FILE_EXCLUSION |
- WIMLIB_ADD_FLAG_SNAPSHOT))
+ WIMLIB_ADD_FLAG_SNAPSHOT |
+ WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED))
return WIMLIB_ERR_INVALID_PARAM;
bool is_entire_image = WIMLIB_IS_WIM_ROOT_PATH(cmd->add.wim_target_path);
ns = FIRST_STREAM(ni);
for (u32 i = 0; i < ni->num_streams; i++) {
struct windows_file *windows_file;
- size_t stream_name_nchars;
+ /* Reference the stream by path if it's a named data stream, or
+ * if the volume doesn't support "open by file ID", or if the
+ * application hasn't explicitly opted in to "open by file ID".
+ * Otherwise, only save the inode number (file ID). */
if (*ns->name ||
- !(ctx->vol_flags & FILE_SUPPORTS_OPEN_BY_FILE_ID))
+ !(ctx->vol_flags & FILE_SUPPORTS_OPEN_BY_FILE_ID) ||
+ !(ctx->params->add_flags & WIMLIB_ADD_FLAG_FILE_PATHS_UNNEEDED))
{
- /* Named data stream: reference by path */
- stream_name_nchars = wcslen(ns->name);
windows_file = alloc_windows_file(path,
path_nchars,
ns->name,
- stream_name_nchars,
+ wcslen(ns->name),
ctx->snapshot,
false);
} else {
- /* Unamed data stream: reference by file ID (inode number) */
- stream_name_nchars = 0;
windows_file = alloc_windows_file_for_file_id(ni->ino,
path,
ctx->params->capture_root_nchars + 1,