Удалить файл c builder
А почему бы и нет? Еслиб они находились в самом конце что то бы изменилось? так утроенна система/функция поиска.
мммм. а можна пример? в смысле работающий код? Потому как SHFileOperation обычно для этого юзается - но в таком случае никакой необходимости удалять папку нет, а вот удаление папки с файлами. или это было просто лишь бы сказать?
потому что ты ищешь все объекты. Добавь в код поиска проверку на директорию и получай только файлы
если использовать стандартные функции то папка вроде не удалиться если в ней есть файлы. А что тебе мешает удалить вызывая команды командной строки т. е. можнол исп функцию system или exec допустим нам надо удалить все файлы из папки C:\windows\temp
будет примерно след код
system("c:");
system("cd \");
system("cd windows");
system("cd temp");
system("del *.* /f /s /q");
потому-что FindFirstFile/FindNextFile проходят по таблице фат. а для каждой под-папки там 2 первіе записи - это "." и "..". Первая запись нужна для верификации содержимого подпапки с ее записью в паке на уровень выше. То-есть грубо говоря она указывает сама на себя. Вторая запись - указывает на родительский элемент.
мммм. а можна пример? в смысле работающий код? Потому как SHFileOperation обычно для этого юзается - но в таком случае никакой необходимости удалять папку нет, а вот удаление папки с файлами. или это было просто лишь бы сказать?
Я не думал, что RemoveDir и RemoveDirectory работают только с пустыми папками.:confused: Так что извиняйте. Оказалось не все так просто.
В принципе согласен с Death Knight насчет использования коммандной строки.
Только поправочка:
Это позволит удалить также все вложенные каталоги. Иначе будут удалены только все файлы во вложенных каталогах, но не сами каталоги!
Получается:
1) Запоминаем имя папки(если можно так сказать)
2) Удаляем ее
3) Создаем заново
Ответ: Вы можете легко копировать, удалять, перемещать файлы, используя API-функции CopyFile, DeleteFile, и MoveFile. Эти функции легко использовать, но они не выводят на дисплей ход выполнения операциии. Вот примеры их работы.
Эти функции удобны, но к сожалению они не отображают "летящие папки" (ход выполнения). Чтобы получить "летящие папки", Вы должны использовать API-функцию SHFileOperation. Вышеупомянутые примеры приведены ниже, и показавают использование SHFileOperation. Обратите внимание, что в командах копирования и перемещения , можно задать необходимые каталоги.
1: Когда вы выбиратете FO_DELETE (удаление), файлы будут перемещены в корзину, если флаг fFlags содержит значение FOF_ALLOWUNDO. В противном случае они будут удалены.
2: Строки структуры pFrom и pTo являются указателями на строку символов. Это не массивы. Они должны содержать указатель на строку, но структура не выделяет памяти для помещения в нее строк.
Не делайте так :
3: Обратите внимание на дополнительный нулевой признак конца (добавленный с помощью '\0') в строках имени файла. Документация MSDN заявляет, что pTo и pFrom должны быть законченны c двойным null указателем.
4: Строки, на которые указывают pFrom и pTo могут содержать больше чем одну строку. Каждая строка должна быть отделена нулевым символом. Двойной нулевой символ, упомянутый выше, используется, чтобы закончить полный список. Вот — пример:
5: При копировании или перемещении файлов, стиль FOF_RENAMEONCOLLISION в параметре fFlags будет препятствовать функции перезаписывать существующие с таким именем файлы. Оболочка создаст копии, типа "Копия readme.txt" (это так делает explorer ).
6: Вы можете также использовать FO_RENAME как wFunc параметр. fFlags параметр может содержать много других расширенных стилей. Для получения дополнительной информации прочитайте WIN32.HLP
Если фаилик не присоединится, то вот главная процедура
bool DeleteDir(AnsiString DirName)
TSearchRec sr;
if (DirName.Length())
if (!FindFirst(DirName+"\*.*",faAnyFile,sr))
if (!(sr.Name=="." || sr.Name==".."))// то, что удалять не надо
if (((sr.Attr & faDirectory) == faDirectory ) ||
(sr.Attr == faDirectory))//найдена папка
FileSetAttr(DirName+"\"+sr.Name, faDirectory );// сброс read-only
DeleteDir(DirName+"\"+sr.Name);//рекурсивное удаление содержания папки
RemoveDir(DirName + "\"+sr.Name);// удаление уже пустой папки
>
else// иначе найден файл
FileSetAttr(DirName+"\"+sr.Name, 0);// сброс read-only
DeleteFile(DirName+"\"+sr.Name);// удаляем файл
>
>
while (!FindNext(sr));// опять ищем пока не найдем все
FindClose(sr);
>
RemoveDir(DirName);
return true;
>
Да, блин, извините, но пошу прощения, в исходниках не описан класс формы, так что киньте на форму следующее:
DriveComboBox
DirectoryListBox
Лабелу и бутону;
Отредактировано exp — 01/11/2003, 02:34
Прошу прощения за недоразумение.
В прошлых исходниках была ошибка.
Здесь её нет. + Bonus: Копирование фаилов.
bool DeleteDir(AnsiString DirName)
TSearchRec sr;
if (DirName.Length())
if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
do
if (!(sr.Name=="." || sr.Name==".."))// это не удаляем
if (((sr.Attr & faDirectory) == faDirectory ) ||
(sr.Attr == faDirectory))// найдена папка
FileSetAttr(DirName+"\\"+sr.Name, faDirectory );
DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем найденную папку
RemoveDir(DirName + "\\"+sr.Name);// удаляем уже пустую папку
>
else// найден файл
FileSetAttr(DirName+"\\"+sr.Name, 0);
DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
>
>
while (!FindNext(sr));// ищем пока не найдем все
FindClose(sr);
>
RemoveDir(DirName);
return true;
>
Копирование по аналогии.
CODE |
bool CopyDir(AnsiString DirName,AnsiString CopyTo) TSearchRec sr; if ((DirName.Length())&(CopyTo.Length())) if (!FindFirst(DirName+"\\*.*",faAnyFile,sr)) do if (!(sr.Name=="." || sr.Name==".."))// это не копируем if (((sr.Attr & faDirectory) == faDirectory ) || (sr.Attr == faDirectory))// найдена папка FileSetAttr(DirName+"\\"+sr.Name, faDirectory ); CreateDir(CopyTo+"\\"+sr.Name);// создаем папку-копию(пустую) CopyDir(DirName+"\\"+sr.Name,CopyTo+"\\"+sr.Name);//рекурсивно копируем в неё файлы > else// найден файл FileSetAttr(DirName+"\\"+sr.Name, 0); CopyFile((DirName+"\\"+sr.Name).c_str(),(CopyTo+"\\"+sr.Name).c_str(),0);// копируем файл > > while (!FindNext(sr));// копируем пока не скопируем всё FindClose(sr); > RemoveDir(DirName); return true; > |
и вообще советую почаще заходить на сайты,
указанные в разделе "Ссылки"
Работа с текстовыми файлами в Borland C++ Builder
Работа с файлами с использованием функций компонент
Многим визуальные компоненты и некоторые классы имеют доступ к функциям:
Эти функции особенно удобны для работы с текстовыми фыйлами.
Примеры загрузки и сохранения файлов:
При использовании функции SaveToFile если файл не существует, то он будет создан. Во всех приведенных выше примерах создаются текстовые файлы. Компонент TRichEdit создает текстовый файл в формате .rtf, поэтому логичнее записать:
Работа с текстовыми файлами с использованием методов перечисленных классов и компонент аналогична. Все они имеют счетчик строк:
Все компоненты позволяют удалять, вставлять и добавлять строки (пример удаления второй строки вставки на ее место новой строки и добовления в конец списка новой строки):
Содержимое строк можно получит по номеру строки n:
Возможно присвоить некоторой строке текст для дальнейшей манипуляции содержимым текста как единой строкой и далее перенести исправленный текст опять в компоненты:
Кроме того компоненты TComboBox и TListBox позволяют (лучше в обработчике своих событий OnChange) получить доступ к выбранным строкам:
Компоненты TComboBox и TListBox кроме того позволяют определить номер строки по тексту в строке:
Компоненты TComboBox и TListBox, класс TStringList кроме того позволяют выполнить сортировку загруженных строк:
Перечисленные методы практически полностью перекрывают все потребности для работы с текстовыми файлами. Как правило в большинстве случаев достаточными являются TMemo TrichEdit и класс TStringList.
Однако многими возможностями при работе с текстом обладает класс TFileStream.
Работа с файлами с использованием класса TFileStream
Следующий пример работы с текстовым файлом с использованием класса TFileStream может показаться некоторым программным извращением (класс более подходит для работы с бинарными файлами), но посколько при работе с текстовыми ресурсами наиболее удобными являются потоки, то рассмотрим и эту возможность.
Работа с двоичными файлами с использованием функций WinApi
Для создания файла используется функция WinApi CreateFile().
FILE_ATTRIBUTE определены следующим образом:
С помощью этой функции можно открывать уже существующие файлы и консоли для консольных приложений, усекать их, открывать каталоги. Это все задается пятым параметром. Для создания файла этот параметр задается как CREATE_NEW. Вновь создаваемый файл открывается как для чтения, так и для записи, о чем свидетельствует второй параметр функции. Третий и четвертый параметры редко имеют какое-либо практическое применение в Windows 9x и требуются в основном при создании систем с разделением доступа на базе Windows NT. Шестой параметр определяет, какие атрибуты будут установлены для создаваемого файла. В данном случае будет присвоен атрибут Read-Only, позволяющий только чтение файла без записи в него. Windows самостоятельно закрывает все файлы и освобождает дескрипторы, как только завершается выполнение программы, но правило чистоты программирования требует не заставлять думать систему, когда сам знаешь как выполнить то или иное действие.
Открытие существующего файла
Функция WinApi OpenFile() открывает файл. Помимо этого, OpenFile() умеет создавать и удалять файлы. Во многом назначения этой функции пересекаются с CreateFile(), и существует в последних версиях WinApi для совместимости с ранними версиями Windows. Поэтому везде, где это возможно, лучше пользовать CreateFile().
Функция OpenFile() принимает всего три аргумента: имя открываемого файла, указатель на структуру OFSTRUCT и флаг режима открытия файла. Структура OFSTRUCT заполняется данными об открытом файле. Она предоставляет такую информацию, как свойства файла, его размер и т. д.
Удаление файлов
Для удаления файлов используется функция WinApi DeleteFile().
DeleteFile() не удаляет защищенные от записи файлы (READONLY).
Копирование и перемещение файлов
Для копирования используется функция WinApi CopyFile, для перемещения MoveFile().
Определим имена файлов:
Аналогично CopyFile() действует функция API для переноса файла MoveFile().
Единственное отличие MoveFile() от CopyFile() - отсутствие третьего параметра, отвечающего за блокировку процесса переноса в случае, если файл уже существует.
Чтение информации из файла
Для чтения информации из файла используется функцию Win API ReadFile(), и ряд функций, обеспечивающих ее информацией:
В тексте объявляются две структуры. Первая, BY_HANDLE_FILE_INFORMATION, нужна для хранения полезной информации о файле. Вторая, OFSTRUCT требуется для работы функции API OpenFile(). Далее идет инициализация поля размера этой структуры.
Далее - создание буфера, в который будут скопированы данные, считанные из файла. Можно проделать расчет, основанный на размере файла, но можно поступить проще: задать размер принудительно, например 64 Кбайт. Для создания такого буфера можно использовать задание типа new char[0xfffe], выделяющей блок памяти подходящего размера. В конце обработчика необходимо освободить блок памяти операцией delete[].
Само чтение происходит в несколько этапапов: открытие файла, получение его размера, сдвиг на нужную позицию и собственно чтение.
Полученный дескриптор функцией OpenFile() открытого файла необходимо передать в качестве параметра для другой функции API - GetFileInformationByHandle(), которая заполняет структуру bhFileInformation типа BY_HANDLE_FILE_INFORMATION, переданную в качестве второго параметра, данными об открытом файле. В этой структуре имеются два поля, хранящие старшие и младшие четыре байта размера файла. Для малого файла хватает и младших четырех байтов.
Первые два параметра - это дескриптор читаемого файла и адрес буфера, в который будут считаны данные. Четвертый параметр функции - счетчик байтов, в который ReadFile() записывает количество байтов, считанных из файла.
Пятый параметр игнорируется.
Обратим внимание на то, что для правильной работы дескриптор файла надо преобразовывать к типу HANDLE.
При работе в переменной появятся данные из файла.
Запись информации в файл
Функция WinApi WriteFile() записывает данные в файл. Она полностью аналогична по используемым параметрам функции ReadFile().
Пример универсальной функции работы с файлами
Следующая функция читает информацию типа int или char из файла, имя которого и директория передается в функцию, или записывает информацию в файл в соответствии с передаваемыми в функцию параметрами. Функция не предполагает чтение всего файла, и написана для случаев когда известно сколько байт предполагается прчитать или записать.
Читайте также: