Как удалить все содержимое каталога без удаления самого каталога? Я хочу, чтобы в основном пустую папку, но оставить ее (и разрешения) нетронутыми.NSFileManager удалить содержимое каталога
ответ
Э.Г. с помощью каталога нумератор:
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:path];
NSString *file;
while (file = [enumerator nextObject]) {
NSError *error = nil;
BOOL result = [fileManager removeItemAtPath:[path stringByAppendingPathComponent:file] error:&error];
if (!result && error) {
NSLog(@"Error: %@", error);
}
}
Swift
let fileManager = NSFileManager.defaultManager()
let enumerator = fileManager.enumeratorAtURL(cacheURL, includingPropertiesForKeys: nil, options: nil, errorHandler: nil)
while let file = enumerator?.nextObject() as? String {
fileManager.removeItemAtURL(cacheURL.URLByAppendingPathComponent(file), error: nil)
}
Попробуйте это:
NSFileManager *manager = [NSFileManager defaultManager];
NSString *dirToEmpty = ... //directory to empty
NSError *error = nil;
NSArray *files = [manager contentsOfDirectoryAtPath:dirToEmpty
error:&error];
if(error) {
//deal with error and bail.
}
for(NSString *file in files) {
[manager removeItemAtPath:[dirToEmpty stringByAppendingPathComponent:file]
error:&error];
if(error) {
//an error occurred...
}
}
'contentsOfDirectoryAtPath ::' не дает вам полный путь к содержимому. –
Нет необходимости тестировать «.». или "..", поскольку 'contentOfDirectoryAtPath: error' _filters_ их; from docs ** Поиск неглубокий и, следовательно, не возвращает содержимое каких-либо подкаталогов. Этот возвращенный массив не содержит строк для текущего каталога («.»), Родительского каталога («..») или вилки ресурсов (начинаются с «._») и не пересекает символические ссылки. ** – petert
@petert Whoa , это очень старый ответ. Спасибо за информацию. –
Документация contentsOfDirectoryAtPath:error:
говорит:
Поиск неглубокое и поэтому не возвращает содержимое подкаталоги. Этот возвращенный массив не содержит строк для текущего каталога («.»), Родительского каталога («..») или вилки ресурсов (начинаются с «._») и не пересекает символические ссылки.
Таким образом:
---(file != @"." && file != @"..")---
не имеет значения.
Почему бы не удалить весь каталог и не воссоздать впоследствии? Просто удалите атрибуты и разрешения файлов перед их удалением, а затем заново создайте их с теми же атрибутами.
Зачем вам удалять папку и запускать возможные проблемы (например, разрешения), если вы можете просто удалить ее содержимое? –
Часто лучше сканировать каталог и удалять файлы из исходного кода, так как гораздо надежнее восстанавливать и сообщать об ошибках. – petert
Ответ Georg Fritzsche для Swift не работал для меня. Вместо чтения перечисленного объекта как строки, прочитайте его как NSURL.
let fileManager = NSFileManager.defaultManager()
let url = NSURL(string: "foo/bar")
let enumerator = fileManager.enumeratorAtURL(url, includingPropertiesForKeys: nil, options: nil, errorHandler: nil)
while let file = enumerator?.nextObject() as? NSURL {
fileManager.removeItemAtURL(file, error: nil)
}
Вы можете продлить NSFileManager
так:
extension NSFileManager {
func clearFolderAtPath(path: String) -> Void {
for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] {
self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil)
}
}
}
Затем вы можете очистить папку, как это: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")
в скор 2,0:
if let enumerator = NSFileManager.defaultManager().enumeratorAtPath(dataPath) {
while let fileName = enumerator.nextObject() as? String {
do {
try NSFileManager.defaultManager().removeItemAtPath("\(dataPath)\(fileName)")
}
catch let e as NSError {
print(e)
}
catch {
print("error")
}
}
}
Swift 2.1.1:
public func deleteContentsOfFolder()
{
// folderURL
if let folderURL = self.URL()
{
// enumerator
if let enumerator = NSFileManager.defaultManager().enumeratorAtURL(folderURL, includingPropertiesForKeys: nil, options: [], errorHandler: nil)
{
// item
while let item = enumerator.nextObject()
{
// itemURL
if let itemURL = item as? NSURL
{
do
{
try NSFileManager.defaultManager().removeItemAtURL(itemURL)
}
catch let error as NSError
{
print("JBSFile Exception: Could not delete item within folder. \(error)")
}
catch
{
print("JBSFile Exception: Could not delete item within folder.")
}
}
}
}
}
}
Swift 3, если кто нуждается в ней для быстрой резки/вставки
let fileManager = FileManager.default
let fileUrls = fileManager.enumerator(at: folderUrl, includingPropertiesForKeys: nil)
while let fileUrl = fileUrls?.nextObject() {
do {
try fileManager.removeItem(at: fileUrl as! URL)
} catch {
print(error)
}
}
- 1. Содержимое каталога списка NSFileManager, за исключением каталогов
- 2. Phing - удалить содержимое каталога без самого каталога
- 3. Golang удалить все содержимое каталога
- 4. NSFileManager: удалить объект
- 5. Как удалить каталог и его содержимое с помощью NSFileManager
- 6. NSFileManager Ошибка создания каталога 518 NSFileWriteUnsupportedSchemeError
- 7. Содержимое каталога каталога
- 8. Удалить содержимое каталога FTP с помощью CURL
- 9. Как удалить содержимое каталога с помощью ftw
- 10. В nant, как удалить содержимое каталога, но не самого каталога?
- 11. Как удалить содержимое каталога Documents (а не самого каталога Documents)?
- 12. Удалить содержимое NSURL Пути
- 13. Удалить изображение из каталога приложения в iPhone
- 14. NSFileManager просматривает файлы с сервера?
- 15. Показать содержимое двух списков каталога объединений
- 16. Содержимое каталога копирования
- 17. Содержимое веб-каталога
- 18. PHP удаляет содержимое каталога
- 19. Содержимое каталога в списке
- 20. Кордова читать содержимое каталога
- 21. Javascript читать содержимое каталога
- 22. Как отобразить содержимое каталога
- 23. Показать содержимое каталога Ruby
- 24. Найти содержимое каталога
- 25. Содержимое каталога в Haskell
- 26. Azure показывает содержимое каталога
- 27. Удалить указанный файл из каталога документов
- 28. Objective-C: Удалить все файлы из каталога
- 29. Как удалить файлы временного каталога fron iOS?
- 30. iOS NSFileManager - удалить файл из основного пакета приложений
Не забудьте проверить, действительно ли 'removeItemAtPath:' не удалось выполнить попытку использования объекта ошибки. По крайней мере, вы можете сообщить больше ошибок, чем есть на самом деле. –
@Peter: Ой, спасибо. –
В вашем цикле while есть проблема, вы не можете объявить переменную внутри круглых скобок! – Psycho