Тема : [req] Удалить очень много-много файлов, NTFS


barabashka  03-10-2009 13:32
Требуется способ или средство для удаления огромного (больше миллиона небольших файлов размером в несколько байт) количества файлов, находящихся в папке, можно удалить папку целиком.

Вроде задача примитивнейшая, но это было во времена FAT32, и возможности прямого редактирования диска утилитами типа WinHEX или diskeditor, сейчас данная задача на сервере выливается примерно в 2 недели работы сервера.

Вобщем нужно решение. А пока сервер удаляет файлы обычным способом ;)

hirez  03-10-2009 19:18
Похоже нет быстрого способа. Мне кажется или удаление в Total Commander работает быстрее чем в проводнике?
Может хранить маленькие файлы на отдельном разделе, если есть возможность, и удалять при необходимости форматированием?

barabashka  03-10-2009 19:21
Что делать потом - вопрос уже решен ;)

Нужен ответ на вопрос: "Что делать сейчас?" ;)

Тотал может и удаляет быстрее, но пока еще ни проводник, ни тотал в папочку зайти не смогли ;) Удалить просто так папочку ни тот ни другой не могут, проверяют ее содержимое предварительно.

Пока сервер занимается тем, что из коммандной строки удаляет файлы посредством

del *.*

hirez  03-10-2009 20:02
Сейчас похоже ждать остается. Может кто-то знает способ, но что-то поисковики молчат. Неудивительно что зайти не можешь. Я пытался зайти в папку с несколькими десятками тысяч файлов(текстовики с номерами проехавших машин), ждал долго и забил. Оставил тамошнему местному админу разбираться с ними :).

uladzimirus  03-10-2009 20:06
а вариант написать маленькую утилиту на С++ чтобы работала в фоновом режиме?

uladzimirus  03-10-2009 20:09
просто сталкивался с тем, что через тотал файлик не всегда быстро удалялся. а низкоуровневым использую только нужны функции работало быстрее. другого способа я не вижу.

hirez  03-10-2009 20:21
barabashka: А del *.* кстати работает долго. Все консольные приложения, которые выводят на экран информацию, работают долго.
Лучше наверное юзать @echo off. Только не уверен что echo поможет.
Просто когда писал консольные проги зааметил что чем больше выводится на экран инфорации, тем дольше процесс выполняется. Особенно это касается длинных циклов с парой быстрых команд и выводом информации о прогрессе.

barabashka  03-10-2009 20:21
а вариант написать маленькую утилиту на С++ чтобы работала в фоновом режиме?А какой смысл? Если свернул командную строку и тоже фоновый режим получился ;)

barabashka: А del *.* кстати работает долго. Все консольные приложения, которые выводят на экран информацию, работают долго.
Лучше наверное юзать @echo off.Да оно походу на экране выведет только результат... ну или если напорется на файл, который удалить не получится.

---

А вот и результат:
http://img230.imageshack.us/img230/6228/capturewq.jpg
del оказалась очень шустрой ;) Всего около 10 часов потребовалось.

Блин, а ведь при расчете фар сказал, что удалит за 2 недели :)

uladzimirus  03-10-2009 20:42
я подразумевал под фоновым режимом, чтобы без вывода на экран удалялось и без привлечения внимания. т.к. вывод на экран сильно тормозит работу программы.

cyberb  04-10-2009 09:06
2 недели потому что far при удалении запрашивает info на файл - размер, права доступа и тд. del просто проходит по директирии и удаляет все записи(файлы). Ессно это быстрее.

barabashka  04-10-2009 13:38
я подразумевал под фоновым режимом, чтобы без вывода на экран удалялось и без привлечения внимания. т.к. вывод на экран сильно тормозит работу программы.
Я привел скриншот, какой там вывод на экран? оно же не пишет какой оно файл удаляет, вот если бы писало - согласен, а так разницы нет.

streepman  04-10-2009 15:54
barabashka пишет:
можно удалить папку целиком.
А почему не
rd /q /s C:\Path\to\folder
У меня папку с 1024 файлами удалила меньше чем за секунду.
Хотя, думаю, во многом, зависит от скорости диска\массива данная операция.

kr0tik  04-10-2009 18:59
кстати, да, rd работает шустрее.
Я удалял около 100 тыщ мелких файлов на виндовом серваке, правда не помню сколько времени заняло. barabashka , будет интересно за сколько утилита справиться с такой кучей.

barabashka  04-10-2009 23:02
Тыща файлов на NTFS - это не больше миллиона. У NTFS есть косяк, когда файлов становится реально очень дохера, или когда места на диске мало, или что-то там еще, вобщем тогда она начинает нереально тормозить.

Замерить rd уже не получится, файлы снесены и больше скапливаться не будут в таком количестве. Ну может как-нить в будущем.

Вот, блин, всопминая FAT32, запускаешь WinHex, открываешь диск, находишь нужную папочку, хренась первый символ... и нету ни папочки, ни файлов... дальше на всякий случай chkdsk запускаешь. Хоть 20 миллионов файлов - дело нескольких секунд.

Orr  04-10-2009 23:31
Сдается мне, что в FAT32, не может быть мульёна записей прямо в одной папке. Да и накрылись бы они уже давно на FAT32 рваной кепкой, а может и партиция слетела бы при таких нагрузках. Короче не надо FAT 32=)

А самый-самый радикальный способ удалить неудаляемое это переписать все нужное в надежное место и формат. Это так же самый радикальный и зачастую самый быстрый быстрый способ дефрагментации

barabashka  05-10-2009 00:02
Ну про FAT32 я утрировал, суть главное передать.

Что касается переписать все нужное в нужное место - обрати внимание на то, откуда все удаляется ;)

Orr  05-10-2009 09:03
Я для общей информации писал, проблему ты уже давно решил.

Sticker  05-10-2009 23:30
Есть ещё вариант через vbs.

Dim WshShell
Dim strTarget
Dim Fso : Set Fso = CreateObject("Scripting.FileSystemObject")
set WshShell = createobject("wscript.shell")

strTarget = "Y:\Test\*.*"

On Error Resume Next

fso.DeleteFile (strTarget), True
fso.DeleteFolder (strTarget), True

set fso = Nothing
set wshshell = Nothing
set objShell = Nothing

strTarget правится под нужную папку.
Очень удобный вариант, например, для ночной очистки общеюзерской папки обмена на файл-серваке.