Sergey Guralnik : extrac32: Create directory for extracted file if need.
Module: wine Branch: master Commit: 7925c9b0287e1fe28108afe879d454b18681369b URL: http://source.winehq.org/git/wine.git/?a=commit;h=7925c9b0287e1fe28108afe879... Author: Sergey Guralnik <serhio(a)etersoft.ru> Date: Thu Apr 11 10:45:58 2013 +0300 extrac32: Create directory for extracted file if need. --- programs/extrac32/extrac32.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/programs/extrac32/extrac32.c b/programs/extrac32/extrac32.c index 111d2a7..644f885 100644 --- a/programs/extrac32/extrac32.c +++ b/programs/extrac32/extrac32.c @@ -23,6 +23,7 @@ #include <shellapi.h> #include <setupapi.h> #include <shlwapi.h> +#include <shlobj.h> #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;
participants (1)
-
Alexandre Julliard