Delphi удалить все файлы в папке

Обновлено: 21.11.2024

Мне нужно удалить файлы с именами «Master1», «Master2» и т. д. (без расширений) из заданного каталога. Проблема в том, что я никогда не знаю, сколько файлов Master1, Master2 и т. д. будет создано во время выполнения. Оно никогда не должно быть больше 10, но независимо от того, насколько большое число я бы произвольно установил, это число всегда может быть превышено. Вот почему я бы предпочел использовать подстановочные знаки. Возможно ли это?

Ответ 1:

Вы будете очень разочарованы, потому что в зависимости от порядка размещения файлов в вашей структуре каталогов удаление файла приводит к тому, что FindNext пропускает существующие файлы, которые совпадают, и, таким образом, вы не удалите все нужные файлы. . Что вам нужно сделать, это настроить список для удаления. Затем, когда список настроен, вы можете удалить их.

Примечание: обратите внимание, что многие люди думают, что все, что вам нужно сделать, это создать список, а затем удалить его. Это неправда. Есть много файлов, которые могут иметь установленный атрибут read/only и т. д. Таким образом, вы должны сначала очистить это, иначе удаление не удастся. Итак, если вы заметили, в моей процедуре я очищаю все атрибуты, которые могли быть установлены для файла. Вот пример:

Вы бы назвали это так: DeleteTempRaw('C:\TEMP\MASTER*.*');

Ответ 2

Сначала заполните список именами файлов, которые вы хотите удалить. Вот функция общего назначения для этого. Учитывая путь ( APath ) и маску файла ( AMask ), подпрограмма заполнит AList полными путями всех файлов, соответствующих AMask .

Вот как использовать подпрограмму:

Ответ 3

Классическим способом решения этой проблемы является использование цикла FindFirst/FindNext/FindClose для поиска файлов в целевом каталоге и удаления каждого из них по мере нахождения, например:

Совет Питера Белоу и Эдди Шипмана

Исходный ресурс: The Delphi Pool
Автор : Разное
Добавлено: 22 февраля 2010 г.
Последнее обновление: 22 февраля 2010 г.

Контент веб-сайта находится под лицензией Creative Commons Attribution 4.0 International (CC BY-4.0). Авторские права © 2022, Питер Джонсон.

Спасибо. Мы получили ваш запрос и незамедлительно ответим.

Присоединяйтесь к нам!

  • Общаться с другими участниками
  • Уведомления об ответах
    на ваши сообщения
  • Поиск по ключевым словам
  • Доступ в один клик к вашим
    любимым форумам
  • Автоматические подписи
    на ваших сообщениях
  • Лучше всего то, что это бесплатно!

*Функции Tek-Tips зависят от того, получают ли участники электронную почту. Присоединяясь, вы соглашаетесь на получение электронной почты.

Правила публикации

Реклама, продажа, рекрутинг, размещение курсовых и дипломных работ запрещено.

Как удалить все файлы в папке?

Как удалить все файлы в папке?

Я думал, что простая команда, подобная приведенной ниже, сработает?

Нет. Deletefile обрабатывает один файл за раз.
Попробуйте это.

процедура deleteallfiles(dir : string);
var sl : tstringlist;
старший : tsearchrec;
i,mx : целое число;
начать
sl := tstringlist.create;
попробуйте
sl.clear;
если findfirst(dir+'*.*',faanyfile,sr) = 0,
затем начать,
повторить
sl.add(sr.name);
до тех пор, пока не найдется следующий(sr) <> 0;
найтиблизко(ср);
конец;
if messagedlg('Об удалении '
+inttostr(sl.count)
+' файлов. Продолжить?,
mtconfirmation,
[mbyes,mbno], 0) = mryes
затем начать
mx := sl.count - 1;
для i := 0 to mx
do deletefile(sl[i]);
конец;
наконец
sl.free;
конец;
конец;

Если это глупо, но работает, это не глупо

Я нашел этот код в сети, который я немного изменил, и он отлично сработал для меня.

Я до сих пор не понимаю, как это работает и правильно ли это делать при удалении файлов в каталоге.
Возможно, кто-то с опытом сможет объяснить, что происходит.

Информация о каталоге: TSearchRec;
r : целое число;

процедура TForm1.Button1Click(Sender: TObject);
begin
r := FindFirst('C:\tmp\*.*', FaAnyfile, DirInfo);
при r = 0 начинайте
if ((DirInfo.Attr и FaDirectory <> FaDirectory) и
(DirInfo.Attr и FaVolumeId <> FaVolumeID)) затем
if DeleteFile( pChar('C:\tmp\' + DirInfo.Name))
= false then
ShowMessage('Невозможно удалить: C:\tmp\' +
DirInfo.Name);
r := FindNext(DirInfo);
конец;
SysUtils.FindClose(DirInfo);

TSearchRec определяет информацию, которую ищут функции FindFirst или FindNext. В вашем примере кода DirInfo относится к этому типу. Вот что делает код (я напишу его в виде псевдокода!):

Найти первый файл, соответствующий указанным критериям (т. е.найти в C:\tmp\ любой файл) и сохранить результат этой операции поиска в целочисленной переменной r (FindFirst возвращает 0, если файл был успешно расположен)
пока результат операции поиска успешен (т.е. r = 0) сделать
если (файл не является файлом каталога) и (файл не является файлом с идентификатором тома), то
если операция удаления файла не удалась для указанного файла, то
отображать сообщение «Невозможно удалить указанный файл» (DirInfo.Name представляет имя файла, включая расширение)
конец, если
конец, если
найти следующий файл, соответствующий указанным выше критериям, и сохранить результат в r< br />end while
освобождает память, выделенную FindFirst (тем самым завершая последовательность FindFirst/FindNext)

Примечание: DirInfo.Attr представляет атрибуты файла. Информацию о тестировании определенных атрибутов см. в файле справки в разделе "TSearchRec".

Я написал рекурсивную процедуру для удаления всего каталога, включая подпапку. Надеюсь, это поможет.

процедура DeleteOneDirectory;
var
l_attr : слово;
l_SearchRec : TSearchRec;
начать,
если FindFirst(path+'\*.*',faAnyFile,l_SearchRec) = 0, то
начать,
повторить,
если (l_SearchRec.Name <> '.') и (l_SearchRec.Name <> '..') then
begin
if not DeleteFile (PChar(path+'\'+l_SearchRec.Name)) then < br />begin
l_attr := FileGetAttr(path+'\'+l_SearchRec.Name);
если (l_attr и faReadOnly <> 0) или
(l_attr и faHidden <> 0) или
(l_attr и faSysFile <> 0), то
начать
FileSetAttr (path+'\'+l_SearchRec.Name, faArchive);
if DeleteFile (PChar(path+'\'+l_SearchRec.Name)) then
;
end
else
if (l_attr и faDirectory <> 0) then
DeleteOneDirectory (path+'\'+l_SearchRec.Name, AShowErr)
end
конец;
до FindNext(l_SearchRec) <> 0;
НайтиЗакрыть(l_SearchRec);
конец;
конец;

Спасибо всем за ваши сообщения. Клайв, это было хорошо объяснено. Я и сам не смог бы сделать лучше.

Отправлено предупреждение

Спасибо, что помогаете защищать форумы Tek-Tips от неприемлемых сообщений.
Персонал Tek-Tips проверит это и примет соответствующие меры.

Ответить в этой теме

Размещение сообщений на форумах Tek-Tips доступно только для участников.

Нажмите здесь, чтобы присоединиться к Tek-Tips и пообщаться с другими участниками! Уже участник? Войти

Как рекурсивно удалить все файлы и папки в Delphi?

ClearFolder (FolderPath +’\\’+ f.Name, маска, рекурсия); конец; конец; пока (НайтиСледующий(f)<>0); наконец, SysUtils.FindClose (f) end; конец; Как бы там ни было, проблема с вашим кодом в том, что он никогда не вызывает DeleteFile. Таким образом, каталоги никогда не очищаются, вызовы RemoveDir не выполняются и так далее.

Как искать каталоги в Delphi Pascal?

Приведенный ниже исходный код сканирует каталоги и подкаталоги из заданной начальной точки и сохраняет все пути в двоичной древовидной структуре. Вам нужно будет поместить две кнопки на форму, назвать одну Filesearch, а другую — древовидной печатью.

Почему createdirectory не найден в Delphi Win32?

Один или несколько промежуточных каталогов не существуют; эта функция создаст только последний каталог в пути. Я предполагаю, что вы получили ERROR_PATH_NOT_FOUND, и документация предлагает возможную причину: вы пытаетесь создать несколько уровней подкаталогов одновременно, что функция не поддерживает.

Как создать длинный путь в Delphi Win32?

Длинный путь в приведенном ниже коде правильно создается в окне CMD как параметр, вставленный в MKDIR. Моя работа заключается в создании этого длинного пути по частям. Я разделил путь по символу «\\» на массив строк. Затем я перебираю массив и строю совокупный путь из каждого элемента. Цикл корректно строит полный путь без ошибок.

Что лучше, ifileoperation или shfileoperation в Delphi?

Вот как использовать IFileOperation в Delphi и обеспечить создание несуществующих папок в операции копирования. IFileOperation имеет много преимуществ по сравнению с функцией SHFileOperation, например возможность выполнять разные операции за один вызов.

Можно ли выполнить более одной операции с помощью shfileoperation?

Вы можете удалить несколько файлов, скопировать еще несколько, переименовать папку, применить свойства к файлу — и все это за одну операцию. SHFileOperation может выполнять только одну операцию за раз: копировать, перемещать, переименовывать или удалять. В этом посте я сосредоточусь на копировании файлов.

Может ли код возврата из shfileoperation быть неточным?

Коды возврата от SHFileOperation могут вводить в заблуждение или быть неточными. Расширяемость. В качестве интерфейса модели компонентных объектов (COM) возможности IFileOperation могут быть расширены третьей стороной для удовлетворения их конкретных потребностей, хотя это должно быть очень редким случаем.

Я хочу удалить все файлы с расширением *.db из определенного
каталога.
Имена меняются каждый раз при запуске программы, поэтому я не имею ни малейшего представления
настоящих имен.
Может кто-нибудь, пожалуйста, скажите мне, как это сделать.

В случае с каталогом на локальном диске и Delphi 6 используйте ShellChangeNotifier из
Samples, чтобы знать, когда в каталог вносятся изменения. В другом случае вы
можете использовать таймер и периодически тестировать содержимое каталога, используя старые добрые компоненты 3.1
FileListBox, DirectoryListBox (невидимые).

Цитата
> Привет,

> Я хочу удалить все файлы с расширением *.db из определенного
> каталога.
> Имена меняются каждый раз при запуске программы, так что я понятия не имею
> о настоящих именах.
> Может кто-нибудь, пожалуйста, скажите мне, как это сделать.

> С уважением.

Цитата

Рики написал:
> Я хочу удалить все файлы с расширением *.db из определенного
> каталога.
> Имена меняются каждый раз при запуске программы, так что я понятия не имею
> о настоящих именах.
> Может кто-нибудь, пожалуйста, скажите мне, как это сделать.

var
R: TSearchRec;
Путь: строка;
Начать
Путь := 'C:\';
если FindFirst(Path + '*.db', faAnyFile, R) = 0, то
попробуйте
повторить,
если R.Attr и faDirectory = 0, то
DeleteFile (Путь + R.Name);
до FindNext(R) <> 0;
наконец
FindClose(R);
конец;
конец;


<************************************************ ******************************>
процедура DeleteDirectoryContents(DirName,strExt : String);
<*************************************************** ***************************>
var
SearchRec : TSearchRec;
fullDirName : строка;
начать
findfirst(DirName + '\'+ strExt, faAnyFile, SearchRec);
While (findnext(SearchRec) = 0) Сделайте
if NOT(SearchRec.Name='..')
то
if (SearchRec.Attr And faDirectory) > 0 then
begin
DeleteDirectoryContents(DirName + '\' + SearchRec.name);
fullDirName := DirName + SearchRec.name;
УдалитьКаталог(Pchar(полноеИмяКаталога));
end
else
SysUtils.DeleteFile(DirName + '\' + SearchRec.name);
конец;

Цитата
Рики написал:
> Привет,

> Я хочу удалить все файлы с расширением *.db из определенного
> каталога.
> Имена меняются каждый раз при запуске программы, так что я понятия не имею
> о настоящих именах.
> Может кто-нибудь, пожалуйста, скажите мне, как это сделать.

> С уважением.

Цитата
В статье Рики написал:
> Привет,

> Я хочу удалить все файлы с расширением *.db из определенного
> каталога.
> Имена меняются каждый раз при запуске программы, так что я понятия не имею
> о настоящих именах.
> Может кто-нибудь, пожалуйста, скажите мне, как это сделать.

Если вы хотите создать программу (или процедуру в программе), которая
автоматически удаляет некоторые файлы, вы можете использовать FindFirst(), FindNext()
и FindClose(), чтобы найти файлы и DeleteFile() для их удаления.

Еще один вариант — использовать функцию Windows API под названием SHFileOperation().
AFAICS из файлов справки Win32, это позволяет вам «удалить» файлы
в корзину.

Читайте также: