Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизКак быстро удалить файл? Найти похожие ветки
← →
rolex (2006-02-16 17:13) [0]Нужно очитстить каталог Temporaru Internet Files. Делаю это так:
1) если в корзину удалять:function DeleteRecycled(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
begin
wFunc:=FO_DELETE;
fFlags:=FOF_SILENT or FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
pFrom:=PChar(dir+#0);
end;
Result:=(0=ShFileOperation(fos));
end;
2) безвозвратно:function TForm1.DeleteF(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
begin
wFunc:=FO_DELETE;
fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
pFrom:=PChar(dir+#0);
end;
Result:=(0=ShFileOperation(fos));
end;
Думаю вы все знаете что в этой папке несколько тысяч файлов. И удаление происходит ну ОООЧень долго и той и другой процедурой.
Как быть? Ведь если через винду удалять, то всё происходит гораздо быстрей!
← →
Defunct © (2006-02-17 20:34) [1]быстрее всего работает команда
deltree *.*
← →
Джо © (2006-02-18 04:21) [2]Создал только что 10000 файлов, функция DeleteFile в цикле удалила их практически мгновенно, примерно за 1 сек.
← →
Defunct © (2006-02-18 04:56) [3]Джо © (18.02.06 04:21) [2]
Это понятно, когда файлы нефрагментированы и каталоги нефрагментированы да еще и NTFS - удаление будет происходить быстро. А вот на FAT да с фрагментированнымим файлами и каталогами (internet temporary files - изобилует такими) удаление будет происходить долго.
Команды ОС Del/DelTree оптимизированы специально для быстрого удаления большого числа файлов - помечают сразу все файлы каталога как удаленные и после чего корректируют таблицу FAT с наименее возможным количеством обращений к диску. Попробуйте для интереса (только корзину отключить!) ;>
← →
Джо © (2006-02-18 05:13) [4]> [3] Defunct © (18.02.06 04:56)
Задумался. Может, так оно и есть, насчет системных комманд (кстати, в XP нету deltree, вместо нее rmdir /s). Удаляет, действительно, очень быстро.
← →
Defunct © (2006-02-18 05:20) [5]> кстати, в XP нету deltree,
быть такого не может
ps: у меня стоит XP (команду эту пользую) ;>
← →
Джо © (2006-02-18 05:27) [6]> [5] Defunct © (18.02.06 05:20)
> > кстати, в XP нету deltree,
> быть такого не может
>
> ps: у меня стоит XP (команду эту пользую) ;>
Прямо и не знаю, что сказать. Комманды у меня такой нету (SP2), вот выдержка из Help из раздела Unavailable MS-DOS Commands.
The following MS-DOS commands are not available at the command prompt.
Command - New procedure or reason for obsolescence
assign - Not currently supported.
backup - Not currently supported.
choice - Not currently supported.
ctty - Not currently supported.
dblspace - Not currently supported.
deltree - The rmdir /s command deletes directories containing files and subdirectories. For more information about the rmdir command, see Rmdir.
---
Само собой, что такую комманду знаю и во времена ДОС ее использовал. Сейчас не использую, и ее отсутствие обнаружил случайно. :)
← →
Джо © (2006-02-18 05:33) [7]Кстати, и вот такая мысль. Влияет ли дефрагментированность файлов на скорость их удаления? В любом случае, DeleteFile с самим файлом ничего не делает, а всего лишь делает соответствующие записи в таблице размещения файлов (как на NTFS — не представляю).
← →
Defunct © (2006-02-18 05:41) [8]MS Windows XP [Ver. 5.1.2600] (SP2)
да действительно
> help deltree - не работает
а
> deltree
продолжает работать. А у вас как? что вообще "is not recognized"?
← →
Джо © (2006-02-18 05:44) [9]> [8] Defunct © (18.02.06 05:41)
Угу, "deltree" is not recognized as an internal or external command,
operable program or batch file.
← →
Defunct © (2006-02-18 05:51) [10]> а всего лишь делает соответствующие записи в таблице размещения файлов
и в корректирует запись в каталоге - стирает первую букву имени файла, т.о. помечая его как удаленный.
> Влияет ли дефрагментированность файлов на скорость их удаления?
влияет. если представить, что FAT - это отражение диска, то при удалении фрагментированной цепочки придется непоследовательно обращаться к разным секторам диска. А при непоследовательном чтении/записи секторов вступает в силу такой параметр диска как Avarage Seek, который всегда выше чем Track-to-Track seek.
← →
Defunct © (2006-02-18 05:57) [11]> Avarage Seek
*average...
> Угу, "deltree" is not recognized as an internal or external command,
надо же..
а какая версия ОС? может cmd неправильный?
← →
Джо © (2006-02-18 06:12) [12]> [11] Defunct © (18.02.06 05:57)
> а какая версия ОС? может cmd неправильный?
Windows XP prof., второй cервис-пак, Version 5.1.2600.
Коммандный процессор стандартный, да это и неважно, поскольку deltree это не внутренняя команда, реализована в DELTREE.EXE.
← →
Defunct © (2006-02-18 06:21) [13]Джо © (18.02.06 06:12) [12]
> Коммандный процессор стандартный, да это и неважно, поскольку deltree это не внутренняя команда, реализована в DELTREE.EXE.
Все, понял почему она у меня работает.
На винте установлен еще WinME, и в пути попала строка к WinME(шному)\Command
вот deltree из арсенала WinME и запускается под XP. Странно только, что не говорит о несовместимости версий.
← →
Джо © (2006-02-18 06:23) [14]> [13] Defunct © (18.02.06 06:21)
Ну, хоть с этим разобрались :)
← →
rolex (2006-02-18 09:59) [15]Для безвозвратного удаления заменил:
function TForm1.DeleteF(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
begin
wFunc:=FO_DELETE;
fFlags:=FOF_SILENT or FOF_NOCONFIRMATION;
pFrom:=PChar(dir+#0);
end;
Result:=(0=ShFileOperation(fos));
end;
на обычный DeleteFile, стало ГОРАЗДО быстрее.
А как быть с кодом, для удаления в корзину?function DeleteRecycled(dir:string):Boolean;
var
fos:TSHFileOpStruct;
begin
ZeroMemory(@fos,SizeOf(fos));
with fos do
begin
wFunc:=FO_DELETE;
fFlags:=FOF_SILENT or FOF_NOCONFIRMATION or FOF_ALLOWUNDO;
pFrom:=PChar(dir+#0);
end;
Result:=(0=ShFileOperation(fos));
end;
Может его тоже можно как-то разогнать?
← →
Anatoly Podgoretsky © (2006-02-18 11:35) [16]Джо © (18.02.06 06:12) [12]
Зато есть встроеные Del/Erase
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\app>del /?
Удаление одного или нескольких файлов.
DEL [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
ERASE [/P] [/F] [/S] [/Q] [/A[[:]атрибуты]] имена
/S Удаление указанных файлов из всех подкаталогов.
← →
Джо © (2006-02-18 15:34) [17]> [16] Anatoly Podgoretsky © (18.02.06 11:35)
> Джо © (18.02.06 06:12) [12]
> Зато есть встроеные Del/Erase
Это я знаю. Кроме того, у rmdir, как я писал, также есть ключ /s.
← →
Джо © (2006-02-18 15:35) [18]> [15] rolex (18.02.06 09:59)
> А как быть с кодом, для удаления в корзину?
> ...
> Может его тоже можно как-то разогнать?
Не думаю, что это возможно, по крайней мере, докумментированными способами.
← →
begin...end © (2006-02-18 16:54) [19]> Defunct © (18.02.06 04:56) [3]
> Команды ОС Del/DelTree оптимизированы специально для быстрого
> удаления большого числа файлов - помечают сразу все файлы
> каталога как удаленные и после чего корректируют таблицу
> FAT с наименее возможным количеством обращений к диску.
Ой. Откуда информация?
← →
Defunct © (2006-02-18 17:10) [20]begin...end © (18.02.06 16:54) [19]
Ой, кто пришел!
из лесу вестимо.
← →
begin...end © (2006-02-18 17:20) [21]> Defunct © (18.02.06 17:10) [20]
Гы. Болеете?
← →
Defunct © (2006-02-18 17:34) [22]> begin...end © (18.02.06 17:20) [21]
нет, спасибо, все хорошо.
а вы?
← →
begin...end © (2006-02-18 17:39) [23]> Defunct © (18.02.06 17:34) [22]
> нет, спасибо, все хорошо.
Тогда почему в [20] дан такой ответ на вопрос?
> а вы?
Нет.
← →
Defunct © (2006-02-18 18:21) [24]> Тогда почему в [20] дан такой ответ на вопрос?
А разве можно ответить как-то по-другому на [19]?
← →
begin...end © (2006-02-18 18:32) [25]> Defunct © (18.02.06 18:21) [24]
Да, конечно. Например, можно ответить правду.
← →
Defunct © (2006-02-18 18:56) [26]> Да, конечно. Например, можно ответить правду.
Я вам уже говорил неоднократно - хотите конструктивного диалога, не задавайте двусмысленных вопросов. Знаете нечто больше - говорите сразу.
что обозначает "Ой." - удивление? сарказм?
← →
begin...end © (2006-02-18 19:02) [27]> Defunct © (18.02.06 18:56) [26]
> не задавайте двусмысленных вопросов.
А я их и не задаю. Вопрос в [19] вполне конкретен: "Откуда информация?". Никакой двусмысленности.
> Знаете нечто больше - говорите сразу.
Зачем?
> что обозначает "Ой." - удивление? сарказм?
Удивление. Это так важно?
← →
Defunct © (2006-02-18 19:16) [28]>> Знаете нечто больше - говорите сразу.
> Зачем?
Хотя бы для того, чтобы собеседнику было интересно с вами общаться.
> Вопрос в [19] вполне конкретен: "Откуда информация?". Никакой двусмысленности.
информация основана на анализе command.com ms-dos v 6.22.
← →
begin...end © (2006-02-18 19:35) [29]> Defunct © (18.02.06 19:16) [28]
> информация основана на анализе command.com ms-dos v 6.22.
Я не совсем понимаю, зачем сообщать информацию, относящуюся к MS-DOS, в обсуждении, относящемся к Windows XP.
В XP работа команды DEL, вызванной для удаления нескольких файлов, основана на функциях FindFirstFileW/FindNextFileW/FindClose и DeleteFileW. Поэтому, вопреки [3], вряд ли следует ожидать какого-либо ускорения работы за счёт использования этой команды по сравнению с ручным вызовом указанных функций.
← →
Defunct © (2006-02-18 20:01) [30]> Поэтому, вопреки [3], вряд ли следует ожидать какого-либо ускорения работы за счёт использования этой команды
Не настаиваю, но если вам не составит труда, а также интересен этот вопрос, то предлагаю вам написать и исследовать код из комбинации указанных вами функций, который мог бы сравниться по быстродействие с вышеназванными командами OS. Разумеется если у вас есть на это время и желание этим заняться.
← →
app © (2006-02-18 20:18) [31]А вас случайно персональная почта не имеется, если нет то для бедных к нас есть чат
← →
begin...end © (2006-02-18 22:20) [32]> Defunct © (18.02.06 20:01) [30]
Честно говоря, проверять очевидные вещи сильного желания нет.
Код на основе указанных мной функций может быть примерно таким:function DelCommand(const Dir: string): Integer;
var
FD: TWin32FindData;
H: THandle;
begin
Result := 0;
H := FindFirstFile(PChar(Dir + "*.*"), FD);
if H <> INVALID_HANDLE_VALUE then
try
repeat
if FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
if DeleteFile(Dir + FD.cFileName) then
Inc(Result)
end
else
begin
if (StrComp(FD.cFileName, ".") <> 0) and (StrComp(FD.cFileName, "..") <> 0) then
Inc(Result, DelCommand(Dir + FD.cFileName + "\"))
end
until not FindNextFile(H, FD)
finally
Windows.FindClose(H)
end
end
Функция возвращает общее количество удалённых файлов. Путь к каталогу нужно указывать с завершающим слэшем.
Трудно выполнить полностью корректное тестирование, т.к. при работе cmd.exe выполняется много дополнительных действий -- например, работа с консолью.
Для тестирования были созданы две копии папки Temporary Internet Files на томе NTFS. Каждая из них имела размер 123 МБ и содержала 12645 файлов и 21 папку. Первая из них была очищена приведённым выше кодом -- DelCommand("E:\T1\") -- причём функция возвратила именно 12645, т.е. были удалены все файлы. После этого компьютер был перезагружен, и вторая папка очищалась командой del E:\T2 /s /q.
Результаты (Windows XP SP2) таковы:DeleteFile -- 13 секунд
del -- 23 секунды
Есть существенное замечание: я НЕ отключал вывод в консоль (просто потому что забыл, как это делается), поэтому в неё выводились имена каждого из удалённых файлов. Вероятно, это и есть главная причина более медленной работы del. Было бы неплохо, если бы кто-нибудь протестировал эту команду, отключив консольный вывод. У меня же на это нет ни времени, ни сил.
← →
defunct © (2006-02-18 23:11) [33]begin...end © (18.02.06 22:20) [32]
respect!
Есть существенное замечание: я НЕ отключал вывод в консоль (просто потому что забыл, как это делается), поэтому в неё выводились имена каждого из удалённых файлов. Вероятно, это и есть главная причина более медленной работы del. Было бы неплохо, если бы кто-нибудь протестировал эту команду, отключив консольный вывод. У меня же на это нет ни времени, ни сил.
для чистоты эксперимента, если не затруднит
rmdir /s
← →
begin...end © (2006-02-19 10:04) [34]> defunct © (18.02.06 23:11) [33]
rmdir /s /q -- 17 секунд.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.047 c