FO_MOVE SHFileOperation has a bug where move operations originating with a wildcard that are involving multiple source files (>1) do not work under wine unless there operation move also a folder. Fix in the next patch
Analysis of the bug: https://bugs.winehq.org/show_bug.cgi?id=39269 Signed-off-by: Lorenzo Ferrillo lorenzofersteam@live.it --- dlls/shell32/tests/shlfileop.c | 65 ++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+)
diff --git a/dlls/shell32/tests/shlfileop.c b/dlls/shell32/tests/shlfileop.c index 27c7244042..ca7876c846 100644 --- a/dlls/shell32/tests/shlfileop.c +++ b/dlls/shell32/tests/shlfileop.c @@ -2697,6 +2697,69 @@ static BOOL is_old_shell32(void) return FALSE; }
+ +static void test_move_wildchar(void) +{ + SHFILEOPSTRUCTA shfo; + CHAR from[5*MAX_PATH]; + CHAR to[5*MAX_PATH]; + DWORD retval; + + clean_after_shfo_tests(); + + CreateDirectoryA("test4.txt", NULL); + CreateDirectoryA("testdir2", NULL); + createTestFile("testdir2\one.txt"); + + shfo.hwnd = NULL; + shfo.wFunc = FO_MOVE; + shfo.pFrom = from; + shfo.pTo = to; + shfo.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR; + shfo.hNameMappings = NULL; + shfo.lpszProgressTitle = NULL; + shfo.fAnyOperationsAborted = FALSE; + + set_curr_dir_path(from, "testdir2\*.*\0"); + set_curr_dir_path(to, "test4.txt\0"); + retval = SHFileOperationA(&shfo); + ok(retval == ERROR_SUCCESS, "SHFileOperation failed\n"); + ok(!shfo.fAnyOperationsAborted, "fAnyOperationsAborted %d\n", shfo.fAnyOperationsAborted); + ok(file_exists("testdir2"), "dir should not be moved\n"); + ok(!file_exists("testdir2\one.txt"), "file should be moved\n"); + ok(file_exists("test4.txt\one.txt"), "file should be moved here\n"); + + DeleteFileA("test4.txt\one.txt"); + DeleteFileA("testdir2\one.txt"); + RemoveDirectoryA("test4.txt"); + RemoveDirectoryA("testdir2"); + + CreateDirectoryA("test4.txt", NULL); + CreateDirectoryA("testdir2", NULL); + createTestFile("testdir2\one.txt"); + createTestFile("testdir2\two.txt"); + + shfo.fAnyOperationsAborted = FALSE; + set_curr_dir_path(from, "testdir2\*.*\0"); + set_curr_dir_path(to, "test4.txt\0"); + retval = SHFileOperationA(&shfo); + todo_wine ok(retval == ERROR_SUCCESS, "SHFileOperation failed\n"); + todo_wine ok(!shfo.fAnyOperationsAborted, "fAnyOperationsAborted %d\n", shfo.fAnyOperationsAborted); + ok(file_exists("testdir2"), "dir should not be moved\n"); + todo_wine ok(!file_exists("testdir2\one.txt"), "file should be moved\n"); + todo_wine ok(!file_exists("testdir2\two.txt"), "file should be moved\n"); + todo_wine ok(file_exists("test4.txt\one.txt"), "file should be moved here\n"); + todo_wine ok(file_exists("test4.txt\two.txt"), "file should be moved here\n"); + + DeleteFileA("test4.txt\one.txt"); + DeleteFileA("test4.txt\two.txt"); + DeleteFileA("testdir2\one.txt"); + DeleteFileA("testdir2\two.txt"); + RemoveDirectoryA("test4.txt"); + RemoveDirectoryA("testdir2"); + +} + START_TEST(shlfileop) { clean_after_shfo_tests(); @@ -2742,4 +2805,6 @@ START_TEST(shlfileop) test_unicode();
test_shlmenu(); + + test_move_wildchar(); }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=69411
Your paranoid android.
=== w1064v1809_he (32 bit report) ===
shell32: shlfileop.c:1151: Test failed: Expected ERROR_SUCCESS, got 120 shlfileop.c:1154: Test failed: Expected testdir2\a.txt to exist shlfileop.c:1155: Test failed: Expected testdir2\b.txt to exist