Index: base/files/file_util.h |
diff --git a/base/files/file_util.h b/base/files/file_util.h |
index 77a87e7dade7df8db204dfd33aaafe7209c8a06b..8b56b78af4cc4c52eda638b8a619362807d392e1 100644 |
--- a/base/files/file_util.h |
+++ b/base/files/file_util.h |
@@ -55,21 +55,71 @@ BASE_EXPORT FilePath MakeAbsoluteFilePath(const FilePath& input); |
// particularly speedy in any platform. |
BASE_EXPORT int64_t ComputeDirectorySize(const FilePath& root_path); |
-// Deletes the given path, whether it's a file or a directory. |
-// If it's a directory, it's perfectly happy to delete all of the |
-// directory's contents. Passing true to recursive deletes |
-// subdirectories and their contents as well. |
-// Returns true if successful, false otherwise. It is considered successful |
-// to attempt to delete a file that does not exist. |
+// Deletes the given path. If |path| names a directory and |recursive| is false, |
+// the directory is only deleted if it is empty or is a symbolic link. If |path| |
+// names a directory and |recursive| is true, this function will recursively |
+// delete as much as possible within |path|, ideally ending in success when |
+// |path| is deleted. In case of error, an unspecified amount of |path|'s |
+// original contents may already have been deleted. |
// |
-// In posix environment and if |path| is a symbolic link, this deletes only |
-// the symlink. (even if the symlink points to a non-existent file) |
+// On Windows: as much as possible will always be deleted. Returns true if |
+// |path| was deleted or did not exist. This function will not recurse into |
+// symlinks or mount points (a.k.a. junction points), but rather will delete the |
+// links/points themselves. |
+// |
+// In posix environment and if |path| is a symbolic link, this deletes only the |
+// symlink. (even if the symlink points to a non-existent file) |
// |
// WARNING: USING THIS WITH recursive==true IS EQUIVALENT |
// TO "rm -rf", SO USE WITH CAUTION. |
BASE_EXPORT bool DeleteFile(const FilePath& path, bool recursive); |
#if defined(OS_WIN) |
+struct DeleteFileMetrics { |
+ enum TemporaryDirectoryLocation { |
+ UNDECIDED, // No attempt has yet been made to find a directory. |
+ NONE, // Failed to find a writeable temporary directory. |
+ TEMP, // Using %TEMP%. |
+ VOLUME_TEMP, // Using X:\Temp or X:\Tmp. |
+ PARENT, // Using the directory above the top-most item being deleted. |
+ ITEM, // Using the directory containing the item being deleted. |
+ }; |
+ |
+ TemporaryDirectoryLocation temporary_directory_location; |
+ |
+ // The number of items deleted via the DELETE_ON_CLOSE path (note that |
+ // non-existant items count as successes in this path). |
+ int delete_on_close_success_count; |
+ |
+ // The number of items in |delete_on_close_success_count| that were moved into |
+ // the temp directory. Ideally, this equals |delete_on_close_success_count|, |
+ // meaning that the operation was 100% successful. |
+ int move_to_temp_count; |
+ |
+ // The number of times opening an item to be deleted failed, resulting in a |
+ // fallback to plain ::DeleteFile that succeded. |
+ int delete_file_success_count; |
+ |
+ // The number of times each of the above strategies failed to delete an item. |
+ int fail_count; |
+ |
+ // The total number of retries before giving up (0 if success on the first |
+ // attempt). If the overall operation succeeds and this is not zero, the |
+ // retries were a very good thing. If the overall operation fails and the two |
+ // success counts above are non-zero, then perhaps more retries or some delays |
+ // would have helped. If the overall operation fails and the two success |
+ // counts above are zero, then it's likely that nothing would have helped. |
+ int total_retry_count; |
+ |
+ // The maximum recursion depth. |
+ int max_depth; |
+}; |
+ |
+// The same as DeleteFile, but with metrics about its performance. |
+BASE_EXPORT bool DeleteFileWithMetrics(const FilePath& path, |
+ bool recursive, |
+ DeleteFileMetrics* metrics); |
+ |
// Schedules to delete the given path, whether it's a file or a directory, until |
// the operating system is restarted. |
// Note: |