[PATCH v3 7/7] scrrun: Support wildcards in MoveFolder().
Robert Wilhelm
wine at gitlab.winehq.org
Thu Jul 7 07:27:42 CDT 2022
From: Robert Wilhelm <robert.wilhelm at gmx.net>
Signed-off-by: Robert Wilhelm <robert.wilhelm at gmx.net>
---
dlls/scrrun/Makefile.in | 2 +-
dlls/scrrun/filesystem.c | 48 +++++++++++++++++++++++-----------
dlls/scrrun/tests/filesystem.c | 27 ++++++++++++++++++-
3 files changed, 60 insertions(+), 17 deletions(-)
diff --git a/dlls/scrrun/Makefile.in b/dlls/scrrun/Makefile.in
index 12be899162b..21798694587 100644
--- a/dlls/scrrun/Makefile.in
+++ b/dlls/scrrun/Makefile.in
@@ -1,6 +1,6 @@
MODULE = scrrun.dll
IMPORTLIB = scrrun
-IMPORTS = uuid oleaut32 version advapi32
+IMPORTS = uuid oleaut32 version advapi32 shlwapi
EXTRADLLFLAGS = -Wb,--prefer-native
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 44ead49714e..0a592a27271 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -3769,32 +3769,50 @@ static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface, BSTR source, BSTR
{
DWORD attrs;
int len;
- WCHAR src_drive[MAX_PATH],src_dir[MAX_PATH],dst_path[MAX_PATH],
+ WCHAR src_path[MAX_PATH],src_drive[MAX_PATH],src_dir[MAX_PATH],dst_path[MAX_PATH],
file_name[MAX_PATH],file_ext[MAX_PATH];
+ WIN32_FIND_DATAW ffd;
+ HANDLE f;
+ BOOL wildcard = FALSE;
TRACE("%p %s %s\n", iface, debugstr_w(source), debugstr_w(destination));
if(!source || !destination)
return E_INVALIDARG;
- attrs = GetFileAttributesW(source);
- if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY))
- return CTL_E_PATHNOTFOUND;
-
_wsplitpath(source, src_drive, src_dir, file_name, file_ext);
+ if (wcschr(file_name,'*') || wcschr(file_name,'?') ||wcschr(file_ext,'*') || wcschr(file_ext,'?'))
+ wildcard = TRUE;
+
+ if (!wildcard) {
+ attrs = GetFileAttributesW(source);
+ if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY))
+ return CTL_E_PATHNOTFOUND;
+ }
+
len = lstrlenW(destination);
- if (destination[len-1] == '\\' || destination[len-1] == '/') {
- lstrcpyW(dst_path, destination);
- lstrcatW(dst_path, file_name);
- if (*file_ext) {
- lstrcatW(dst_path, L".");
- lstrcatW(dst_path, file_ext);
- }
- TRACE("move %s to %s\n", debugstr_w(source), debugstr_w(dst_path));
- return MoveFileW(source, dst_path) ? S_OK : create_error(GetLastError());
+ if (wildcard || destination[len-1] == '\\' || destination[len-1] == '/') {
+ f = FindFirstFileW(source, &ffd);
+ if(f == INVALID_HANDLE_VALUE)
+ return create_error(GetLastError());
+
+ do {
+ lstrcpyW(dst_path, destination);
+ lstrcpyW(src_path, src_drive);
+ lstrcatW(src_path, src_dir);
+ if (!PathAppendW(src_path, ffd.cFileName)) return create_error(GetLastError());
+ if (!PathAppendW(dst_path, ffd.cFileName)) return create_error(GetLastError());
+ TRACE("move %s to %s\n", debugstr_w(src_path), debugstr_w(dst_path));
+ if (!MoveFileW(src_path, dst_path))
+ return create_error(GetLastError());
+ } while(FindNextFileW(f, &ffd));
+ FindClose(f);
}
- return MoveFileW(source, destination) ? S_OK : create_error(GetLastError());
+ else {
+ 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 3876598518a..484ec3f7777 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -2603,7 +2603,7 @@ static void test_MoveFile(void)
static void test_MoveFolder(void)
{
BSTR src, dst, str;
- 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;
File *file;
@@ -2692,6 +2692,31 @@ static void test_MoveFolder(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");
+ 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"\\foo1");
+ lstrcpyW(buffW2,pathW);
+ 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_DoOpenPipeStream(void)
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/391
More information about the wine-devel
mailing list