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