Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 214

/ вопрос закрыт /

Здравствуйте, уважаемые эксперты! Главная моя задача: Совершить поиск txt файлов по папкам C:/1, C:/1/2, C:/1/2/3.......C:/1/2/3/4/5/6/7/8/9 и переименовать их в 'ненужный файл.txt'.
--------------------------------------------------------------------------------------
Примечания:
1. Так, как меня учитель считает продвинутым в сфере программирования, мне дали условие - НЕ использовать memo Т_Т
2. Если у вас нет примеров кода, прошу хотябы подтолкнуть на верный путь(подсказать, с чем иметь дело в данной ситуации)
3. Сильно не толкать(Если вы будете выражаться умными словами, я могу не понять вас).

Кудя Вопрос закрыт (ответы не принимаются, мини-форум закрыт)

Вопрос задал: Кудя (статус: Посетитель)
Вопрос отправлен: 19 апреля 2011, 19:18
Состояние вопроса: закрыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 122; последнее сообщение — 27 апреля 2011, 19:15; участников в обсуждении: 4.

Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [6] [7] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 19 апреля 2011, 21:34 [#61]:

Цитата (Кудя):

'End' Excepted but 'Until' found

Мдя, печально... Что бы это значило, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 19 апреля 2011, 21:34 [#62]:

until есть. а где repeat?
см. первоначальный код. удалил слишком много
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 21:34 [#63]:

findnext требует until
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 21:36 [#64]:

program excersise204;
uses
  Classes, windows, SysUtils;
 
procedure DoIt(const Dir: string);
var
  SR: TSearchRec;
begin
  SetCurrentDir(Dir);
  if FindFirst(Dir + '*.exe', faAnyFile, SR) = 0 then
           // ага! если в каталоге нет файла или папки с расширением txt, то
           // цикл просто не запустится и произойдёт выход из процедуры
  begin
    repeat
      if (SR.Name <> '.') and (SR.Name <> '..') then  // лишнее. всегда сработает, т.к.
                                                      // каталоги . и .. точно не соответствуют
                                                      // маске *.txt
      begin
        RenameFile(SR.Name, AnsiLowerCase(SR.Name));   // супер! переименовываем файл, а новое имя
                                                       // какое? а то же самое! :)
        if (SR.Attr and faDirectory) <> 0 then   // если найдётся папка, которая будет иметь
                                                 // расширение txt, то вход в неё будет
          DoIt(Dir + SR.Name + '\');
      end;
    until FindNext(SR) <> 0;
  FindClose(SR);
  end;
end;
 
// ну и процедура сама по себе не вызовется. её надо как-то вызвать
// например, так:
begin
  DoIt('C:');
end.

Этот?=)
Think Different. (c)
min@y™

min@y™ (статус: Доктор наук), 19 апреля 2011, 21:52 [#65]:

Давайте дискуссию продолжим завтра.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 21:54 [#66]:

Ладно, пока поищу чтонить=)
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 21:59 [#67]:

program excersise204;
uses
  Classes, windows, messages, dialogs, SysUtils;
 
procedure DoIt(const Dir: string);
var
  SR: TSearchRec;
begin
  SetCurrentDir(Dir);
  if FindFirst(Dir + '*.txt', faAnyFile, SR) = 0 then
  begin
    repeat
    renamefile(SR.Name, 'ненужныйфайл.txt');
    until FindNext(SR) <> 0;
  FindClose(SR);
  end;
end;
begin
  DoIt('C:\\\\');
end.
Программа без ошибок запускается НО! переименовал 1 файл из многих в одном каталоге и в других каталогах ничего не изменилось. Направьте на путь истины.
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 22:08 [#68]:

Уважаемые Эксперты! Когда вы вернётесь к данному вопросу, прилагайте большего усилия на 2проблемы моего кода:
1.Переименование не только первого встречного тхт.
2.Поиск в подкаталогах, подподподподкаталогах.
Think Different. (c)
Егор

Егор (статус: 10-ый класс), 19 апреля 2011, 22:08 [#69]:

каталоги должны иметь расширение тхт
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Кудя

Кудя (статус: Посетитель), 19 апреля 2011, 22:11 [#70]:

а как это сделать?
Think Different. (c)
Егор

Егор (статус: 10-ый класс), 20 апреля 2011, 05:18 [#71]:

не пиши "не использовать форму". ты же программист? правильно - "консольное приложение".

Цитата (Кудя):

Уважаемые Эксперты! Когда вы вернётесь к данному вопросу, прилагайте большего усилия на 2проблемы моего кода:
1.Переименование не только первого встречного тхт.
2.Поиск в подкаталогах, подподподподкаталогах.

блин, тебе же уже и я, и минай, указывали на эти проблемы.

1. если в папке будет несколько тхт-файлов, как поступать? нельзя иметь несколько файлов с одним и тем же именем "ненужный файл.тхт". первый переименовать получится. остальные - нет. прога вывалится с сообщением об ошибке. но приложение консольное - оно тут же закрывается и ты прочитать ничего не успеваешь.

2. не надо делать поиск папок и файлов в одном и том же цикле. надо ДВА цикла. в одном - искать файлы, во втором - папки.

ты мне вот что скажи. код, который ты привёл, я так понял, где-то найден на просторах интернета? ты его объяснить можешь? каждую строчку? если нет - сначала разберись С КАЖДОЙ СТРОЧКОЙ. если не понимаешь хотя бы одну строку - всё без толку.
а то у меня складывается ощущение, что ты не понимаешь, как работает имеющийся код, но пытаешься вытащить у нас информацию о том, как его доработать, чтобы работало всё.

если понимаешь - напиши комментарии к своей же программе. к каждой строке. пока не напишешь - не буду отвечать. ну или напиши на те строки, которые понимаешь и отметь те, которые НЕ понимаешь.

Цитата (Кудя):

Когда вы вернётесь к данному вопросу, прилагайте большего усилия на...
слово "пожалуйста" забыл.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Кудя

Кудя (статус: Посетитель), 20 апреля 2011, 17:46 [#72]:

program excersise204;          {название программы excersise204}
uses                       {помогает нам перечислить модули}
  Classes, windows, messages, dialogs, SysUtils;    {собственно эти самые модули мы используем в программе, они зависят
от того, какие процедуры мы используем в программе}
 
procedure DoIt(const Dir: string);       {даёт программе понять, что мы начинаем процедуру}
var                 {переменные=)}
  SR: TSearchRec;             {поисковая переменная}
begin          {ну после begin идёт сам смысл программы, что она должна делать, типо начало блока}
  SetCurrentDir(Dir);      {определяет, в какой мы папке, по какой директории идём}
  if FindFirst(Dir + '*.txt', faAnyFile, SR) = 0 then         {поиск (dir-строка, в нашем случае диск С, '*.txt'-файл
любого имени, но расширение тхт, faanyfile-любой файл, абсолютно любой(для чтения например), SR-поисковая переменная,
она тут по копризу процедуры FindFirst)}
  begin           {ну после begin идёт сам смысл программы, что она должна делать, типо начало блока}
    repeat     {повторяет то, что между repeat и until, пока программа не удволетворит себя законченным
результатом=).очень капризная сволоч=(}
    renamefile(SR.Name, 'ненужныйфайл.txt');    {переименовывает файл, сначала пишешь тот, который надо поменять, потом
на то, что хочешь поменять=)}
    until   {если repeat самоудволетворится=Р то программа делает то что после until}
FindNext(SR) <> 0;          {искать следующий файл, если он есть=)}                               
  FindClose(SR);   {закрывает кантору=) findfirst,findnext(если он успешно завершёл канешна)}
  end;         {закрывает блок, который открыл begin}
end;    {закрывает блок, который открыл begin}
begin {ну после begin идёт сам смысл программы, что она должна делать, типо начало блока. тут непонятно, почему в конце
программы это=) НО! в начале неработает запросто=(}
  DoIt('C:\\\\');       {может быть я ошибаюсь, но я думаю что переменной dolt задают смысл(диск С)}   
end.              {закрывает блок, который открыл begin}
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 20 апреля 2011, 17:47 [#73]:

Печально, что вы думаете, что я незнаю, что пишу=(
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 20 апреля 2011, 17:52 [#74]:

блин, ну тогда легче удалить их все, а не переименовывать, думаю учитэль нерасстроится, всёравно ненужныйфайл XD
насчёт двух циклов, я понимаю, но несовсем---как можно искать каталоги?О_о Я с этим просто не сталкивался.
Think Different. (c)
Кудя

Кудя (статус: Посетитель), 20 апреля 2011, 18:18 [#75]:

Если я где-то не в точности описал, скажите, если смогу поподробнее, напишу.
Think Different. (c)
Егор

Егор (статус: 10-ый класс), 20 апреля 2011, 18:44 [#76]:

min@y™: блях-мух, а пацан-то вроде шарит, а? :)

Кудя: кстати, дебагером (отладчиком) пользоваться умеешь?

теперь по коду.
набираем FindFirst, выделяем его и нажимаем f1. в справке по функции сразу же увидим такую таблицу:
Constant       Description
 
faReadOnly     Read-only files
faHidden       Hidden files
faSysFile      System files
faVolumeID     Volume ID files
faDirectory    Directory files
faArchive      Archive files
faAnyFile      Any file
ага! вот оно, нужное нам - faDirectory (Directory files). по этой константе будет производится поиск папок.

procedure DoIt(const Dir: string);
var
  SR: TSearchRec;
begin
  SetCurrentDir(Dir);
 
  // пошёл поиск файлов
  if FindFirst(Dir + '*.txt', faAnyFile, SR) = 0 then
  begin
    repeat
    renamefile(SR.Name, 'ненужныйфайл.txt');
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
 
  // а теперь ищем все папки:
  if FindFirst(Dir + '\*.*', faDirectory, SR) = 0 then
  begin
    repeat
    // здесь отсекаем папки . и .. (как это было у тебя в самом первом варианте)
    // и рекурсивно вызываем DoIt, передавая в качестве имени имя найденной папки
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
 
begin
  DoIt('C:\\\\'); // а зачем обратный слеш учетверять? у тебя есть такой путь "С:\\\\", да?
end.

Кудя: не правь код, который уже выложил. лучше выкладывай новые версии, но старые не трогай. чтобы ссылаться было куда. да и не в курсе же я, что ты код, который выше на два экрана, уже поправил.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Кудя

Кудя (статус: Посетитель), 20 апреля 2011, 19:12 [#77]:

по старой литературе(у меня 5книг делфи) я видел, что если прибавлять слэш, то прога будет искать в каждой папке вплоть по 4-ую папку. Ешо, почему сначало надо искать файлы, а потом папки? Или результат будет всё-равно положительный?
Think Different. (c)
min@y™

min@y™ (статус: Доктор наук), 20 апреля 2011, 19:26 [#78]:

Мдяяяяя... Похоже, мои советы не помогли. Какая жаль!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 20 апреля 2011, 19:39 [#79]:

Цитата (Кудя):

по старой литературе(у меня 5книг делфи) я видел, что если прибавлять слэш, то прога будет искать в каждой папке вплоть по 4-ую папку.

хрень полная.

Цитата (Кудя):

почему сначало надо искать файлы, а потом папки?

а сам подумать?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

min@y™ (статус: Доктор наук), 20 апреля 2011, 19:48 [#80]:

Не надо искать одно щас, а второе потом. Надо искать файлы, которые попадают под маску и составлять из них список. И только после этого переименовывать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [6] [7] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 апреля 2026, 16:39
Выполнено за 0.04 сек.