From 7925c9b0287e1fe28108afe879d454b18681369b Mon Sep 17 00:00:00 2001 From: Sergey Guralnik Date: Thu, 11 Apr 2013 10:45:58 +0300 Subject: [PATCH] extrac32: Create directory for extracted file if need. --- programs/extrac32/extrac32.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/programs/extrac32/extrac32.c b/programs/extrac32/extrac32.c index 111d2a76553..644f8859426 100644 --- a/programs/extrac32/extrac32.c +++ b/programs/extrac32/extrac32.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "wine/unicode.h" #include "wine/debug.h" @@ -31,6 +32,21 @@ WINE_DEFAULT_DEBUG_CHANNEL(extrac32); static BOOL force_mode; +static void create_target_directory(LPWSTR Target) +{ + WCHAR dir[MAX_PATH]; + int res; + + strcpyW(dir, Target); + *PathFindFileNameW(dir) = 0; /* Truncate file name */ + if(!PathIsDirectoryW(dir)) + { + res = SHCreateDirectoryExW(NULL, dir, NULL); + if(res != ERROR_SUCCESS && res != ERROR_ALREADY_EXISTS) + WINE_ERR("Can't create directory: %s\n", wine_dbgstr_w(dir)); + } +} + static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2) { FILE_IN_CABINET_INFO_W *pInfo; @@ -42,6 +58,9 @@ static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Par pInfo = (FILE_IN_CABINET_INFO_W*)Param1; lstrcpyW(pInfo->FullTargetName, (LPCWSTR)Context); lstrcatW(pInfo->FullTargetName, pInfo->NameInCabinet); + /* SetupIterateCabinet() doesn't create full path to target by itself, + so we should do it manually */ + create_target_directory(pInfo->FullTargetName); return FILEOP_DOIT; case SPFILENOTIFY_FILEEXTRACTED: pFilePaths = (FILEPATHS_W*)Param1;