Страница 1 из 1
Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 9:02
Игорь Столяров
Привет всем !
Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Скорее всего - через WinAPI ... Сейчас пользуюсь следующим кодом:
Код: Выделить всё
FIQ QUEUE,PRE(F_IQ)
Name STRING(FILE:MAXFILENAME)
ShortName STRING(13)
Date LONG
Time LONG
Size LONG
Attrib BYTE
END
Loc:Count Long
Code
Free(FIQ)
Directory(FIQ,LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*', FF_:NORMAL)
If Records(FIQ)
Loop Loc:Count = 1 to Records(FIQ) by 1
Get(FIQ,Loc:Count)
If Clip(Left(FIQ.Name)) <> ''
If Exists(LongPath(Clip(System{Prop:DataPath})) & 'Image\' & Clip(Left(FIQ.Name)))
Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\' & Clip(Left(FIQ.Name)))
end
end
end
end
Работает хорошо, но при Records(FIQ) > 10000 ощутимо тормозит ...

Заранее спасибо за любую наводку.

Re: Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 10:13
Дед Пахом
Даже этот код можно оптимизировать - например, убрать проверку If Exists.
Потом убрать остальные строчки (включая декларацию очереди) и оставить только одну:
Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
Re: Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 10:20
Игорь Столяров
Согласен ... Но все равно операция последовательно удаляет по одному файлу последовательным перебором ...

Должна же быть в WinAPI команда очистки папки ... и что-то я ее не найду.
Re: Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 13:25
Дед Пахом
Посмотри API_Remove в clib.clw, хотя я думаю, стандартная REMOVE просто оболочка над ней.
Re: Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 17:15
Admin
Игорь Столяров писал(а):Можно как-нибудь БЫСТРО удалить большое кол-во файлов в заданной папке ?
Работает хорошо, но при Records(FIQ) > 10000 ощутимо тормозит ...

Заранее спасибо за любую наводку.

Ваш вариант -
удаление в корзину
Re: Грохнуть все файлы
Добавлено: 06 Сентябрь 2014, 22:02
Tuko_G
А через RUN(''Del . /Q/S/F') не подаидет.

Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 0:39
gopstop2007
Если удалить все файлы в директории, может переименовать и сразу создать такую же директорию, а потом удалять файлы, или просто удалить директорию командой RMDIR c:\blah /s /q и заново создать такую же

Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 4:14
Admin
Как вариант запустить отдельный поток и в нем удалять по 10-100 файлов в цикле.
Остальная программа будет продолжать работать.
Это в случае если прямо сейчас не нужен "чистый" каталог.
Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 19:18
Игорь Столяров
Дед Пахом писал(а):Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
Нэ работает. Может быть оно и к лучшему ...
gopstop2007 писал(а):RMDIR c:\blah /s /q
Вот это точно делать не надо ... Ничего хорошего в DOS окнах нет, к тому же под Win x64 этот номер уже не пройдет.
Копаем дальше ...
Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 21:25
Дед Пахом
Игорь Столяров писал(а):Дед Пахом писал(а):Remove(LongPath(Clip(System{Prop:DataPath})) & 'Image\*.*')
Нэ работает. Может быть оно и к лучшему ...

Копаем дальше ...
Ну проверь, делов-то:
PROGRAM
MAP
END
CODE
REMOVE('e:\xyz\abc\*.*')
Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 21:30
Игорь Столяров
Так проверил есстессно ... под C63. Сейчас проверю еще под C8/C91 ...
Может дьявол, как обычно, спрятался в деталях ...

Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 22:35
Дед Пахом
Я под C8 проверял.
Re: Грохнуть все файлы
Добавлено: 07 Сентябрь 2014, 22:39
Игорь Столяров
Игорь Столяров писал(а):REMOVE('e:\xyz\abc\*.*')
Докладываю по существу вопроса.
В C63 - Ошибка 5 "Нет доступа".
В C91 - Все работает. Конкретные цифры не интересны, ибо зависят от системы, а вот отношение весьма радостное.
На 20 выборках от 30000 до 50000 файлов скорость выросла ... ровно на порядок (в 10 раз).
И это есть решение. Спасибо !

Re: Грохнуть все файлы
Добавлено: 08 Сентябрь 2014, 10:31
kreator
Есть ещё функция в Clarion'е RemoveDirectory. Вызывает rmdir.
Re: Грохнуть все файлы
Добавлено: 08 Сентябрь 2014, 20:51
seawolf
только перед rmdir надо зачистить папку от файлов - иначе он не сработает (как -то вроде так)