|
Вопрос # 3 296/ вопрос открыт / |
|
Здравствуйте, эксперты!
Не могу решить проблему вот в этом.
Это всё конечно работает, НО! После всего найденного я хочу сохранить содержимое lst2 в файл, а он почемуто не хочет!
(Использую Delphi Lite lst-это listBox и так далее).
Подскажите пожалуйста в чём подвох! Заранее спасибо!
Приложение: Переключить в обычный режим- procedure TForm1.DirFilePath(path:string);
- var sr:TSearchRec;
- ras:string;
- begin
- chdir(path);
- if FindFirst(path+'\*.*',faAnyfile,sr) = 0 then
- try
- repeat
- if (sr.name='.') or (sr.name='..') then continue;
- if (sr.attr and faDirectory)=0 then begin
-
- lst2.items.add(path+'\'+sr.name);
- lst1.items.add(sr.name);
- ras:=copy(sr.name,LastDelimiter('.',sr.name),maxint);
- if ras<>'.mp3' then begin
- lst2.Items.Delete(lst1.Items.Count-1);
- lst1.Items.Delete(lst1.Items.Count-1);
- end;
-
- end else begin
- DirFilePath(path+'\'+sr.name);
- chdir('..');
- end;
- application.processmessages;
- until findnext(sr)<> 0;
- finally
- FindClose(sr);
- end;
- end;
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 17 октября 2009, 11:24
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Отвратительное форматирование исходника!
Пришлось обработать напильником, чтобы проанализировать код.
Посмотри внимательно:
procedure TForm1.DirFilePath(path: string);
var
sr: TSearchRec;
ras: string;
begin
chdir(path); // <-- это лишнее
if FindFirst(path + '\*.*', faAnyfile, sr) = 0
then try
repeat
if (sr.name = '.') or (sr.name = '..')
then continue;
if (sr.attr and faDirectory) = 0
then begin
lst2.items.add(path + '\' + sr.name);
lst1.items.add(sr.name);
ras:= copy(sr.name, LastDelimiter('.', sr.name), maxint); // <-- Не знаешь про функцию
ExtractFileExt()?
if ras <> '.mp3'
then begin
lst2.Items.Delete(lst1.Items.Count - 1); // <-- зачем удалять после добавления?
lst1.Items.Delete(lst1.Items.Count - 1); // <-- не проще ли просто НЕ добавлять НЕ
mp3-файлы?
end;
end
else begin
DirFilePath(path + '\' + sr.name);
chdir('..'); // <-- это лишнее
end;
application.processmessages();
until findnext(sr) <> 0;
finally
FindClose(sr);
end;
end;
{После всего найденного я хочу сохранить содержимое lst2 в файл,
а он почемуто не хочет!}
// А где код, в котором ты пытаешься сохранить содержимое lst2 в файл?
procedure TForm1.FindButtonClick(Sender: TObject);
begin
DirFilePath('C:\Музяка\Попса\Дом-2\Разное'); // :)))
lst2.Items.SaveToFile('C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u');
end;
Если у тебя всё же был кусок кода сохранения, но ты почему-то его суда не скопипастил, и этот код даёт ошибку, то какую?
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 октября 2009, 11:55
Оценка за ответ: 5
Комментарий к оценке: про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое!
зачем удалять после добавления? --- пробовал не добавлять! работает криво! смотрит только что в первом каталоге и всё.
Да к стати додумался вот так -------------------------
procedure TForm1.DirFilePath(path:string);
Var SR:TSearchRec;
FindRes:Integer;
ras:string;
begin
FindRes:=FindFirst(path+'\*.*',faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name='.')or(SR.Name='..')) then
begin
FindRes:=FindNext(SR);
Continue;
end;
// если найден каталог, то
if ((SR.Attr and faDirectory)=faDirectory) then
begin
// входим в процедуру поиска с параметрами текущего каталога +
// каталог, что мы нашли
DirFilePath(path+'\'+SR.Name);
FindRes:=FindNext(SR);
// после осмотра вложенного каталога мы продолжаем поиск
// в этом каталоге
Continue; // продолжить цикл
end;
Lst2.Items.Add(path+'\'+sr.name);
lst1.items.add(sr.name);
ras:=copy(sr.name,LastDelimiter('.',sr.name),maxint);
if ras<>'.mp3' then begin
lst2.Items.Delete(lst1.Items.Count-1);
lst1.Items.Delete(lst1.Items.Count-1);
end;
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 17 октября 2009, 13:34; участников в обсуждении: 4.
|
min@y™ (статус: Доктор наук), 17 октября 2009, 12:25 [#1]:
Цитата (eclipse):
про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое!
Тогда почему не использовал?
Цитата (eclipse):
зачем удалять после добавления? --- пробовал не добавлять! работает криво! смотрит только что в первом каталоге и всё.
Ога, вставлял маску прямо в FindFirst()?
if FindFirst(path + '\*.mp3', faAnyfile, sr) = 0
then ...
Такой вариант подходит только для поиска в каталоге без захода в подкаталоги, ведь их имена (подкаталогов) могут не иметь расширения "mp3".
Цитата (eclipse):
Да к стати додумался вот так
Второй вариант ещё более жуткий, чем первый. Ладно, не мучайся, я взял напильник помельче и...
uses Masks;
// Пусть это быдет функция, которая на всякий случай
// возвращает количество найденных файлов.
function TForm1.DirFilePath(path: string): Cardinal;
var
sr: TSearchRec;
begin
Result:= 0;
if FindFirst(path + '\*.*', faAnyfile, sr) = 0
then try
repeat
if (sr.name = '.') or (sr.name = '..')
then Continue;
if ((sr.attr and faDirectory) = 0) and MatchesMask(sr.Name, '*.mp3')
then begin
lst2.items.add(path + '\' + sr.name);
lst1.items.add(sr.name);
Inc(Result);
end
else Inc(Result, DirFilePath(path + '\' + sr.name));
if Result mod 256 = 255 // Для ускорения работы
then Application.ProcessMessages();
until FindNext(sr) <> 0;
finally
FindClose(sr);
end;
end;
procedure TForm1.FindButtonClick(Sender: TObject);
begin
lst1.Items.BeginUpdate();
lst2.Items.BeginUpdate();
FindButton.Enabled:= False;
try
DirFilePath('C:\Музяка\Попса\Дом-2\Разное'); // :)))
finally
FindButton.Enabled:= True;
lst1.Items.EndUpdate();
lst2.Items.EndUpdate();
lst2.Items.SaveToFile('C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u');
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 17 октября 2009, 12:32 [#2]:
про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое! --------говорил же НЕ ЗНАЛ!
Ога, вставлял маску прямо в FindFirst()?
if FindFirst(path + '\*.mp3', faAnyfile, sr) = 0
then ...-------- ну так пашет же!
Блин! могу весь исходник кинуть (плеера)
|
|
min@y™ (статус: Доктор наук), 17 октября 2009, 12:38 [#3]:
Цитата (eclipse):
Блин! могу весь исходник кинуть (плеера)
Ой, не надо!
Мой код работает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Егор (статус: 10-ый класс), 17 октября 2009, 12:41 [#4]:
Цитата (min@y™):
C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u
))))))))))))))))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
eclipse (статус: Посетитель), 17 октября 2009, 12:43 [#5]:
ХА
|
|
min@y™ (статус: Доктор наук), 17 октября 2009, 12:52 [#6]:
Цитата (eclipse):
ХА
Чо ХА?!
Код мой работает, я спрашиваю?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 17 октября 2009, 13:11 [#7]:
не пробовал! пока мой вариант устраивает
|
|
min@y™ (статус: Доктор наук), 17 октября 2009, 13:19 [#8]:
Цитата (eclipse):
не пробовал! пока мой вариант устраивает
Не понял?!! Я тут для кого стараюсь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ерёмин А.А. (статус: *Администратор), 17 октября 2009, 13:22 [#9]:
eclipse:
Ваш код я переместил в приложение. Примечание в данном случае не имеет смысла, сейчас удалю его.
|
|
eclipse (статус: Посетитель), 17 октября 2009, 13:28 [#10]:
min@y™: я ж выше написал сперва , что дошло до меня и я всё сделел так как мне надо! СПАСИБО ОГРОМНОЕ ЧТО ПОМОГЛИ!
|
|
min@y™ (статус: Доктор наук), 17 октября 2009, 13:34 [#11]:
Цитата (eclipse):
что дошло до меня и я всё сделел так как мне надо
С удалением из списка добавленных файлов с раширением, отличным от mp3?!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|