Piotr Caban : scrrun: Add IFileSystem3::DeleteFolder implementation.

Alexandre Julliard julliard at winehq.org
Tue Jul 30 14:14:21 CDT 2013


Module: wine
Branch: master
Commit: b1af25b056d53e6af0a96550b23d5cbde0cfc3d5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b1af25b056d53e6af0a96550b23d5cbde0cfc3d5

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Jul 30 11:31:50 2013 +0200

scrrun: Add IFileSystem3::DeleteFolder implementation.

---

 dlls/scrrun/filesystem.c |   69 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index 2b84d96..cb9325f 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -1416,12 +1416,77 @@ static HRESULT WINAPI filesys_DeleteFile(IFileSystem3 *iface, BSTR FileSpec,
     return delete_file(FileSpec, SysStringLen(FileSpec), Force);
 }
 
+static HRESULT delete_folder(const WCHAR *folder, DWORD folder_len, VARIANT_BOOL force)
+{
+    WCHAR path[MAX_PATH];
+    DWORD len, name_len;
+    WIN32_FIND_DATAW ffd;
+    HANDLE f;
+    HRESULT hr;
+
+    f = FindFirstFileW(folder, &ffd);
+    if(f == INVALID_HANDLE_VALUE)
+        return create_error(GetLastError());
+
+    len = get_parent_folder_name(folder, folder_len);
+    if(len+1 >= MAX_PATH)
+        return E_FAIL;
+    if(len) {
+        memcpy(path, folder, len*sizeof(WCHAR));
+        path[len++] = '\\';
+    }
+
+    do {
+        if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+            continue;
+        if(ffd.cFileName[0]=='.' && (ffd.cFileName[1]==0 ||
+                    (ffd.cFileName[1]=='.' && ffd.cFileName[2]==0)))
+            continue;
+
+        name_len = strlenW(ffd.cFileName);
+        if(len+name_len+3 >= MAX_PATH) {
+            FindClose(f);
+            return E_FAIL;
+        }
+        memcpy(path+len, ffd.cFileName, name_len*sizeof(WCHAR));
+        path[len+name_len] = '\\';
+        path[len+name_len+1] = '*';
+        path[len+name_len+2] = 0;
+
+        hr = delete_file(path, len+name_len+2, force);
+        if(FAILED(hr)) {
+            FindClose(f);
+            return hr;
+        }
+
+        hr = delete_folder(path, len+name_len+2, force);
+        if(FAILED(hr)) {
+            FindClose(f);
+            return hr;
+        }
+
+        path[len+name_len] = 0;
+        TRACE("deleting %s\n", debugstr_w(path));
+
+        if(!RemoveDirectoryW(path)) {
+            FindClose(f);
+            return create_error(GetLastError());
+        }
+    } while(FindNextFileW(f, &ffd));
+    FindClose(f);
+
+    return S_OK;
+}
+
 static HRESULT WINAPI filesys_DeleteFolder(IFileSystem3 *iface, BSTR FolderSpec,
                                             VARIANT_BOOL Force)
 {
-    FIXME("%p %s %d\n", iface, debugstr_w(FolderSpec), Force);
+    TRACE("%p %s %d\n", iface, debugstr_w(FolderSpec), Force);
 
-    return E_NOTIMPL;
+    if(!FolderSpec)
+        return E_POINTER;
+
+    return delete_folder(FolderSpec, SysStringLen(FolderSpec), Force);
 }
 
 static HRESULT WINAPI filesys_MoveFile(IFileSystem3 *iface, BSTR Source,




More information about the wine-cvs mailing list