Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск файлов. Нужен маленький кусочек кода! Но с большим кол-вом комментов!!! 
:(
    Опции темы
Eugene82
  Дата 30.5.2005, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



smile Помогите первокласснику! Плиз smile

К сессии (13.06.2005) надо написать прогу "Чистка диска"

Cреда Borland C++ Builder 6

Исходные данные и основные требования: Написать программу, которая
а) будет удалять с указанного устройства все файлы, имеющие расширения BAK и $$$;
б) будет удалять с указанного устройства все файлы имеющие расширения EXE, если кроме этого будет существовать в этом каталоге и файл с таким же именем, но с расширением PAS ( или BAS, или C, или FOR), за исключением файлов с именем TURBO.

-----
Почитав мануалы и проч. описания на русском, какие смог найти (с английским плохо к собственному стыду), так же пошарив поиском по Инету и найдя исходник похожей проги, но только на Visual C++ (что большой помощи мне не оказало), убедился, что задача довольно конретная и, привыших абстрагироваться по полной программеров, мало интересует. Начал юзать англоязычный хелп. Даже узнал что мне нужно использовать функции FindFirst(), FindNext(), и FindClose(). Про эти функции в моих русскоязычных мануалах ни слова! smile

Я даже алгоритм слегка вкурил: Есть у меня на форме DriveComboBox, из которого в переменную должно записываться имя диска, есть две кнопочки Search и Delete, по которым соответственно должны вызываться функции FindFirst() и DeleteFile()... А вот какого типа должны быть переменные, и сколько мне их понадобиться, и как их объявлять я не представляю smile

Поможите кто чем может! Пожалуйста!
PM WWW ICQ   Вверх
_hunter
Дата 31.5.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



поиск по словам FindFirst / FindNext на этом форуме тебе поможет


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
Дата 3.6.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(_hunter @ 31.5.2005, 10:33)
поиск по словам FindFirst / FindNext на этом форуме тебе поможет


Поиск помогает. Спору нет. Но постоянно появляются новые вопросы!

Вот например:

Есть фукнция FindDir(char* path,char* mask) {}
Есть значение свойства Drive объекта DriveComboBox1 типа const char

Вопрос: Как присвоить path значение (Drive + двоеточие)?
PM WWW ICQ   Вверх
_hunter
Дата 3.6.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



приведи обоих к ансиСтрингу
типа AnsiString fullPath = AnsiString(path) + AnsiString(Drive)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
Дата 3.6.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(_hunter @ 3.6.2005, 14:13)
приведи обоих к ансиСтрингу
типа AnsiString fullPath = AnsiString(path) + AnsiString(Drive)


Но ведь в FindDir() path определен как char* и компилятор выдаёт Cannot convert 'AnsiString' to 'char *' или 'AnsiString *' to 'char *'!
PM WWW ICQ   Вверх
_hunter
Дата 3.6.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



покажи код ( которым ты пытаешся конвертить )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
  Дата 3.6.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(_hunter @ 3.6.2005, 14:13)
приведи обоих к ансиСтрингу
типа AnsiString fullPath = AnsiString(path) + AnsiString(Drive)


Мне кстати, не AnsiString(path) с AnsiString(Drive) надо складывать!

Мне нужно было AnsiString(Drive) + ":" и присвоить это path! Который char* smile

А AnsiString в char* не конвертируется smile

Я решил пойти другим путём:
Код

void FindDir(char* drive,char* mask)
{
WIN32_FIND_DATA wfd;
HANDLE hfound;
char newpath[MAX_PATH];
char fpath[MAX_PATH];
strcpy(fpath,drive);
strcat(fpath,":\\");
strcat(fpath,mask);
if((hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE) //В этом месте почему-то условие всегда false :( Подскажешь?
{/*Тело*/
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        char drive = DriveComboBox1->Drive;
        char* mask = "*.*";
        FindDir(&drive,mask);
}

PM WWW ICQ   Вверх
_hunter
Дата 3.6.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



а... т.е. ты в FindDir() хочеш char* передать?
не соасем понятно зачем, ну да ладно...
у AnsiString есть такой полезный метод -- c_str()
но для указателей и этот способ пойдет.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
  Дата 3.6.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Можно про использование метода c_str() поподробнее? Какую билиотеку ещё надо подключить? dsrting.h подключена.

И ещё. Почему после передачи значения drive по ссылке оно изменилось?

Была просто буква диска, а во время выполнения функции FindDir drive принимает значение:

буква_дискаal--

Поэтому условие (hfound=FindFirstFile(fpath,&wfd))!=INVALID_HANDLE_VALUE всегда равно false smile Путь некорректен smile
PM WWW ICQ   Вверх
_hunter
Дата 3.6.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



потому как терминатор не ставиш ( нулевой символ )

Цитата

Returns the AnsiString converted to null-terminated character array.

char* __fastcall c_str() const;

Description

c_str returns a pointer a null-terminated character array containing the same characters as the AnsiString. If the AnsiString is unassigned, c_str returns an empty string (“”).

Usually, the value returned by c_str points to the internal character array referenced by the data property. This pointer is valid until the string is next modified (for example when the SetLength method is called or the AnsiString goes out of scope). However, if the internal array is NULL, c_str returns a pointer to a string literal.

The c_str method is intended primarily for reading the value of the AnsiString. To modify the string’s value, use the [] operator or AnsiString methods such as Insert and Delete.

или еще подрбней?

больше ничего подключать не нужно.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
Дата 3.6.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Хотел попросить пример использования smile Но решил сам поискать в хелпе. Нашёл и вышеприведённый текст описания и пример. Добавил строчку по примеру - всё работает!!! smile

Большое спасибо, _hunter! У меня аж настроение поднялось! smile

Завтра буду вывод списка мучать или сразу удаление найденных файлов. smile
PM WWW ICQ   Вверх
Eugene82
  Дата 5.6.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Вот и дошёл я до вывода списка...

Хочу вывести найденные файлы в имеющийся FileListBox1:

Код

FileListBox1->Items->Add(wfd.cFileName); //Выдаёт ошибку "Access violation at address ...  in module ... Read of address 00000000"


Есть вариант:
Код

FileListBox1->AddItem(wfd.cFileName,TObject); //Но что нужно написать вместо TObject?


Это сообщение отредактировал(а) Eugene82 - 5.6.2005, 15:57
PM WWW ICQ   Вверх
Eugene82
  Дата 6.6.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Понял, что FileListBox для моих целей не подходит. Заменил его на простой ListBox. Научил программу выводить в него найденные файлы - файлы выводятся с полным путём.

Теперь надо реализовать удаления файлов(!!!) по сответствующим выделенным строкам.

Проблема первая:
В выделении может быть более одной строки. Т.е надо создать массив и поместить в него выделенные строки. А потом передавать по одному элементу в DeleteFile().

Как создать массив и поместить в него выделенные строки?

Проблема вторая (может саморазрешиться после решения первой?):
Тип строк ListBox TString, а тип аргумента для DeleteFile() есть AnsiString.

Как преобразовать TString в AnsiString?

-----------------------
Реализовал часть a) задания. Осталась часть б).


Это сообщение отредактировал(а) Eugene82 - 6.6.2005, 14:45
PM WWW ICQ   Вверх
_hunter
Дата 6.6.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



береш вектор и обзываещ какую-нить переменную std::vector<AnsiString> и все.
у ListBox' a кажись TStrings... а если обратится по индексу -- получим строку Strings[i]


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Eugene82
Дата 7.6.2005, 07:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



_hunter Спасибо, но я уже сделал проще:
Код

DeleteFile(ListBox1->Items->Strings[i]);

PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.