|
Вопрос # 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 20 апреля 2011, 19:26 [#78]:
Мдяяяяя... Похоже, мои советы не помогли. Какая жаль!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 20 апреля 2011, 19:39 [#79]:
Цитата (Кудя):
по старой литературе(у меня 5книг делфи) я видел, что если прибавлять слэш, то прога будет искать в каждой папке вплоть по 4-ую папку.
хрень полная.
Цитата (Кудя):
почему сначало надо искать файлы, а потом папки?
а сам подумать?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
min@y™ (статус: Доктор наук), 20 апреля 2011, 19:48 [#80]:
Не надо искать одно щас, а второе потом. Надо искать файлы, которые попадают под маску и составлять из них список. И только после этого переименовывать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [« Предыдущая] [1] [2] [3] [4] [5] [6] [7] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|