* Deletes (i.e. moves to Trash) the specified files from a given folder * and updates metadata accordingly. * * @param string $folder The folder (or "root") from which files are deleted. * @param array $files The array of file names to delete. * @return array An associative array with a "success" or "error" message. */
($folder, $files)
| 818 | * @return array An associative array with a "success" or "error" message. |
| 819 | */ |
| 820 | public static function deleteFiles($folder, $files) |
| 821 | { |
| 822 | $errors = []; |
| 823 | $storage = self::storage(); |
| 824 | $isLocal = $storage->isLocal(); |
| 825 | $skipTrash = class_exists('SourceContext') ? SourceContext::isTrashDisabled() : false; |
| 826 | |
| 827 | list($uploadDir, $err) = self::resolveFolderPath($folder, false); |
| 828 | if ($err) { |
| 829 | return ["error" => $err]; |
| 830 | } |
| 831 | $uploadDir .= DIRECTORY_SEPARATOR; |
| 832 | |
| 833 | // Setup the Trash folder and metadata. |
| 834 | $trashDir = ''; |
| 835 | $trashMetadataFile = ''; |
| 836 | $trashData = []; |
| 837 | if (!$skipTrash) { |
| 838 | $trashDir = rtrim(self::trashRoot(), '/\\') . DIRECTORY_SEPARATOR; |
| 839 | if ($storage->stat($trashDir) === null) { |
| 840 | if (!$storage->mkdir($trashDir, 0755, true)) { |
| 841 | $detail = self::adapterErrorDetail($storage); |
| 842 | $msg = $detail !== '' |
| 843 | ? ("Failed to create Trash folder: " . $detail) |
| 844 | : "Failed to create Trash folder. Check source permissions or enable delete permanently (skip trash) for this source."; |
| 845 | return ["error" => $msg]; |
| 846 | } |
| 847 | } |
| 848 | $trashMetadataFile = $trashDir . "trash.json"; |
| 849 | $trashJson = $storage->read($trashMetadataFile); |
| 850 | if ($trashJson !== false) { |
| 851 | $trashData = json_decode($trashJson, true); |
| 852 | } |
| 853 | if (!is_array($trashData)) { |
| 854 | $trashData = []; |
| 855 | } |
| 856 | } |
| 857 | |
| 858 | // Load folder metadata if available. |
| 859 | $metadataFile = self::getMetadataFilePath($folder); |
| 860 | $folderMetadata = file_exists($metadataFile) |
| 861 | ? json_decode(file_get_contents($metadataFile), true) |
| 862 | : []; |
| 863 | if (!is_array($folderMetadata)) { |
| 864 | $folderMetadata = []; |
| 865 | } |
| 866 | |
| 867 | $movedToTrash = []; |
| 868 | $deletedPermanent = []; |
| 869 | $safeFileNamePattern = REGEX_FILE_NAME; |
| 870 | |
| 871 | foreach ($files as $fileName) { |
| 872 | $basename = basename(trim($fileName)); |
| 873 | |
| 874 | // Validate the file name. |
| 875 | if (!preg_match($safeFileNamePattern, $basename)) { |
| 876 | $errors[] = "$basename has an invalid name."; |
| 877 | continue; |
no test coverage detected