Определить, находится ли файл в корзине iCloudDrive

Есть ли способ определить, был ли файл, расположенный в iCloudDrive, перемещен в корзину iCloudDrive? Я мог бы проверить, что URL-адрес содержит «.Trash», но я ищу официальный способ получить это.


person berbie    schedule 12.10.2017    source источник


Ответы (2)


Чтобы определить, находится ли файл/папка в корзине, используйте следующий код:

NSURLRelationship relationship;
NSError *error;
[[NSFileManager defaultManager] getRelationship:&relationship ofDirectory:NSTrashDirectory inDomain:0 toItemAtURL:URL error:&error];
if (relationship == NSURLRelationshipContains) {
    //file is in trash
}
person Marek H    schedule 20.11.2017
comment
Пожалуйста, добавьте краткое описание того, что делает ваш код, иначе этот вопрос можно легко расценить как некачественный. - person briosheje; 20.11.2017
comment
С этим кодом есть некоторые проблемы: 1. Он игнорирует error, а это значит, что если relationship предварительно обнулить, то в случае ошибки он выдаст неверный результат. 2. Не работает с файлами, удаленными из папки iCloud (например, если в Catalina папки Deskop и Documents синхронизированы с iCloud), в ~/Library/Mobile Documents/com~apple~CloudDocs/.Trash, потому что тогда возвращается ошибка (Код=3328 Запрошенная операция не может быть выполнена завершено, поскольку эта функция не поддерживается.) - person Thomas Tempelmann; 03.11.2020
comment
Примечание. Моя вторая часть предыдущего комментария предназначена для macOS, а не для iOS. - person Thomas Tempelmann; 03.11.2020
comment
Также обратите внимание, что если элемент является символической ссылкой, и если эта символическая ссылка теперь указывает в никуда (т. е. не на существующий файл или папку), вы также получите сообщение об ошибке 3328. См. stackoverflow.com/q/64663834/43615 - person Thomas Tempelmann; 10.11.2020

Нашел достойный способ обнаружить это. Начиная с iOS11 возможен следующий подход:

NSURL* fileURL; // any file URL pointing to a file resource
NSURL* trashURL = [NSFileManager.defaultManager URLForDirectory:NSTrashDirectory inDomain:NSUserDomainMask appropriateForURL: fileURL create:NO error:NULL];
if (trashURL && [fileURL.path hasPrefix:trashURL.path])
{
    // fileURL is located in the iCloudDrive trash
}
person berbie    schedule 12.10.2017
comment
Убедитесь, что вы получили канонический путь вашего URL-адреса файла, прежде чем тестировать его таким образом, т. е. получив NSURLCanonicalPathKey или вызвав [NSString stringByResolvingSymlinksInPath]. Без этого вы можете использовать путь, который указывает на корзину через символические ссылки, и тогда ваша проверка не сработает. - person Thomas Tempelmann; 10.11.2020