diff options
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/dirutil.cpp')
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/dirutil.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/dirutil.cpp b/src/libs/dutil/WixToolset.DUtil/dirutil.cpp index 2c02225d..8c7ef461 100644 --- a/src/libs/dutil/WixToolset.DUtil/dirutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/dirutil.cpp | |||
@@ -17,6 +17,8 @@ | |||
17 | #define DirExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DIRUTIL, p, x, s, __VA_ARGS__) | 17 | #define DirExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DIRUTIL, p, x, s, __VA_ARGS__) |
18 | #define DirExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DIRUTIL, e, x, s, __VA_ARGS__) | 18 | #define DirExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DIRUTIL, e, x, s, __VA_ARGS__) |
19 | #define DirExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DIRUTIL, g, x, s, __VA_ARGS__) | 19 | #define DirExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_DIRUTIL, g, x, s, __VA_ARGS__) |
20 | #define DirExitOnPathFailure(x, b, s, ...) ExitOnPathFailureSource(DUTIL_SOURCE_DIRUTIL, x, b, s, __VA_ARGS__) | ||
21 | #define DirExitWithPathLastError(x, s, ...) ExitWithPathLastErrorSource(DUTIL_SOURCE_DIRUTIL, x, s, __VA_ARGS__) | ||
20 | 22 | ||
21 | 23 | ||
22 | /******************************************************************* | 24 | /******************************************************************* |
@@ -184,13 +186,9 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
184 | 186 | ||
185 | if (-1 == (dwAttrib = ::GetFileAttributesW(wzPath))) | 187 | if (-1 == (dwAttrib = ::GetFileAttributesW(wzPath))) |
186 | { | 188 | { |
187 | er = ::GetLastError(); | 189 | DirExitWithPathLastError(hr, "Failed to get attributes for path: %ls", wzPath); |
188 | if (ERROR_FILE_NOT_FOUND == er) // change "file not found" to "path not found" since we were looking for a directory. | 190 | |
189 | { | 191 | ExitFunction1(hr = E_PATHNOTFOUND); |
190 | er = ERROR_PATH_NOT_FOUND; | ||
191 | } | ||
192 | hr = HRESULT_FROM_WIN32(er); | ||
193 | DirExitOnRootFailure(hr, "Failed to get attributes for path: %ls", wzPath); | ||
194 | } | 192 | } |
195 | 193 | ||
196 | if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) | 194 | if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) |
@@ -199,7 +197,9 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
199 | { | 197 | { |
200 | if (!::SetFileAttributesW(wzPath, FILE_ATTRIBUTE_NORMAL)) | 198 | if (!::SetFileAttributesW(wzPath, FILE_ATTRIBUTE_NORMAL)) |
201 | { | 199 | { |
202 | DirExitWithLastError(hr, "Failed to remove read-only attribute from path: %ls", wzPath); | 200 | DirExitWithPathLastError(hr, "Failed to remove read-only attribute from path: %ls", wzPath); |
201 | |||
202 | ExitFunction1(hr = E_PATHNOTFOUND); | ||
203 | } | 203 | } |
204 | } | 204 | } |
205 | 205 | ||
@@ -245,9 +245,12 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
245 | hr = DirEnsureDeleteEx(sczDelete, dwFlags); // recursive call | 245 | hr = DirEnsureDeleteEx(sczDelete, dwFlags); // recursive call |
246 | if (FAILED(hr)) | 246 | if (FAILED(hr)) |
247 | { | 247 | { |
248 | // if we failed to delete a subdirectory, keep trying to finish any remaining files | 248 | // if we failed to delete a subdirectory, keep trying to finish any remaining files |
249 | ExitTraceSource(DUTIL_SOURCE_DIRUTIL, hr, "Failed to delete subdirectory; continuing: %ls", sczDelete); | 249 | if (E_PATHNOTFOUND != hr) |
250 | hr = S_OK; | 250 | { |
251 | ExitTraceSource(DUTIL_SOURCE_DIRUTIL, hr, "Failed to delete subdirectory; continuing: %ls", sczDelete); | ||
252 | } | ||
253 | hr = S_OK; | ||
251 | } | 254 | } |
252 | } | 255 | } |
253 | else if (fDeleteFiles) // this is a file, just delete it | 256 | else if (fDeleteFiles) // this is a file, just delete it |
@@ -256,7 +259,8 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
256 | { | 259 | { |
257 | if (!::SetFileAttributesW(sczDelete, FILE_ATTRIBUTE_NORMAL)) | 260 | if (!::SetFileAttributesW(sczDelete, FILE_ATTRIBUTE_NORMAL)) |
258 | { | 261 | { |
259 | DirExitWithLastError(hr, "Failed to remove attributes from file: %ls", sczDelete); | 262 | DirExitWithPathLastError(hr, "Failed to remove attributes from file: %ls", sczDelete); |
263 | continue; | ||
260 | } | 264 | } |
261 | } | 265 | } |
262 | 266 | ||
@@ -280,7 +284,7 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
280 | } | 284 | } |
281 | else | 285 | else |
282 | { | 286 | { |
283 | DirExitWithLastError(hr, "Failed to delete file: %ls", sczDelete); | 287 | DirExitWithPathLastError(hr, "Failed to delete file: %ls", sczDelete); |
284 | } | 288 | } |
285 | } | 289 | } |
286 | } | 290 | } |
@@ -308,13 +312,21 @@ extern "C" HRESULT DAPI DirEnsureDeleteEx( | |||
308 | } | 312 | } |
309 | } | 313 | } |
310 | 314 | ||
315 | if (E_PATHNOTFOUND == hr || E_FILENOTFOUND == hr) | ||
316 | { | ||
317 | ExitFunction1(hr = E_PATHNOTFOUND); | ||
318 | } | ||
319 | else if (HRESULT_FROM_WIN32(ERROR_DIR_NOT_EMPTY) == hr && !fDeleteFiles && !fRecurse) | ||
320 | { | ||
321 | ExitFunction(); | ||
322 | } | ||
323 | |||
311 | DirExitOnRootFailure(hr, "Failed to remove directory: %ls", wzPath); | 324 | DirExitOnRootFailure(hr, "Failed to remove directory: %ls", wzPath); |
312 | } | 325 | } |
313 | } | 326 | } |
314 | else | 327 | else |
315 | { | 328 | { |
316 | hr = E_UNEXPECTED; | 329 | DirExitWithRootFailure(hr, E_UNEXPECTED, "Directory delete cannot delete file: %ls", wzPath); |
317 | DirExitOnFailure(hr, "Directory delete cannot delete file: %ls", wzPath); | ||
318 | } | 330 | } |
319 | 331 | ||
320 | Assert(S_OK == hr); | 332 | Assert(S_OK == hr); |