From: Robert Wilhelm robert.wilhelm@gmx.net
Signed-off-by: Robert Wilhelm robert.wilhelm@gmx.net --- dlls/scrrun/filesystem.c | 62 ++++++++++++++++++++++++++++------ dlls/scrrun/tests/filesystem.c | 32 +++++++++++++++++- 2 files changed, 82 insertions(+), 12 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index 908ac53683b..fc5ffe752c6 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -3785,8 +3785,11 @@ static HRESULT WINAPI filesys_MoveFile(IFileSystem3 *iface, BSTR source, BSTR de static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface, BSTR source, BSTR destination) { DWORD attrs; - int len,start,end; - WCHAR dst_path[MAX_PATH]; + int i,len,len2,slen,start,end; + WCHAR src_path[MAX_PATH],dst_path[MAX_PATH]; + WIN32_FIND_DATAW ffd; + HANDLE f; + BOOL wildcard = FALSE;
TRACE("%p %s %s\n", iface, debugstr_w(source), debugstr_w(destination));
@@ -3796,20 +3799,57 @@ static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface, BSTR source, BSTR if (FAILED(get_file_name( source, &start, &end))) return E_INVALIDARG;
- attrs = GetFileAttributesW(source); - if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) - return CTL_E_PATHNOTFOUND; + for(i = start; i <= end; i++) + { + if( source[i]=='*' || source[i]=='?') + { + wildcard = TRUE; + break; + } + } + + if (!wildcard) { + attrs = GetFileAttributesW(source); + if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) + return CTL_E_PATHNOTFOUND; + }
+ slen = lstrlenW(source); len = lstrlenW(destination);
- if (destination[len-1] == '\') + if (wildcard || destination[len-1] == '\') + { + f = FindFirstFileW(source, &ffd); + if(f == INVALID_HANDLE_VALUE) + return create_error(GetLastError()); + + do { + memcpy(dst_path, destination, (len+1)*sizeof(WCHAR)); + memcpy(src_path, source, (slen+1)*sizeof(WCHAR)); + if (wildcard) { + len2 = len; + if (destination[len-1] != '\') + { + dst_path[len] = '\'; + len2++; + } + memcpy(dst_path+len2, ffd.cFileName, (lstrlenW(ffd.cFileName)+1)*sizeof(WCHAR)); + memcpy(src_path+start,ffd.cFileName,(lstrlenW(ffd.cFileName)+1)*sizeof(WCHAR)); + } + else { + memcpy(dst_path+len, source + start, (end-start+1)*sizeof(WCHAR)); + dst_path[len+end-start+1]=0; + } + if (!MoveFileW(src_path, dst_path)) + return create_error(GetLastError()); + } while(FindNextFileW(f, &ffd)); + FindClose(f); + } + else { - memcpy(dst_path, destination, (len+1)*sizeof(WCHAR)); - memcpy(dst_path+len, source + start, (end-start+1)*sizeof(WCHAR)); - dst_path[len+end-start+1] = 0; - return MoveFileW(source, dst_path) ? S_OK : create_error(GetLastError()); + return MoveFileW(source, destination) ? S_OK : create_error(GetLastError()); } - return MoveFileW(source, destination) ? S_OK : create_error(GetLastError()); + return S_OK; }
static inline HRESULT copy_file(const WCHAR *source, DWORD source_len, diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index da092f27d3b..df02cd1186b 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -2536,7 +2536,7 @@ static void test_MoveFile(void) { ITextStream *stream; BSTR str, src, dst; - WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH],pathW[MAX_PATH]; + WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH],pathW[MAX_PATH],srcW[MAX_PATH]; HRESULT hr;
str = SysAllocString(L"test.txt"); @@ -2617,6 +2617,36 @@ static void test_MoveFile(void) lstrcatW(pathW,L"foo"); ok(RemoveDirectoryW(pathW), "can't remove %s directory\n", wine_dbgstr_w(pathW)); ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2)); + + GetTempPathW(MAX_PATH, buffW1); + lstrcatW(buffW1,L"foo1"); + GetTempPathW(MAX_PATH, buffW2); + lstrcatW(buffW2,L"foo2"); + GetTempPathW(MAX_PATH, srcW); + lstrcatW(srcW,L"foo?"); + GetTempPathW(MAX_PATH, pathW); + lstrcatW(pathW,L"bar"); + RemoveDirectoryW(buffW1); + RemoveDirectoryW(buffW2); + RemoveDirectoryW(pathW); + ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1)); + ok(CreateDirectoryW(buffW2, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW2)); + ok(CreateDirectoryW(pathW, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(pathW)); + src = SysAllocString(srcW); + dst = SysAllocString(pathW); + hr = IFileSystem3_MoveFolder(fs3, src, dst); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + SysFreeString(src); + SysFreeString(dst); + lstrcpyW(buffW1,pathW); + lstrcatW(buffW1,L"\"); + lstrcatW(buffW1,L"foo1"); + lstrcpyW(buffW2,pathW); + lstrcatW(buffW2,L"\"); + lstrcatW(buffW2,L"foo2"); + ok(RemoveDirectoryW(buffW1), "can't remove %s directory\n", wine_dbgstr_w(buffW1)); + ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2)); + ok(RemoveDirectoryW(pathW), "can't remove %s directory\n", wine_dbgstr_w(pathW)); }
static void test_MoveFolder(void)