Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 22.12.2004, 16:38   [включить плавающее окно]   #1
Andrewk
Мужской Интересующийся
Автор темы
 
Регистрация: 12.07.2004
Адрес: Новосибирск
Поиск файлов в делфи

Есть проблема.
Надо создать список всех файлов содержащихся в папке и во всех подпапках.
//----------------пример
file.txt
rgb/gon/1.jpg | 17.08.04
.........

сначала путь потом дата создания.
Как это сделать?
Andrewk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 22.12.2004, 18:55   [включить плавающее окно]   #2
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
Andrewk, очень просто: открываешь блокнот (notepad.exe), открываешь нужную папку в проводнике, по порядку смотришь в ней файлы и записываешь в блокнот путь к папке и имена файлов, также нажимаешь на каждом Alt+Enter, и аккуратно оттуда выписываешь дату создания. Потом в этой папке таким же образом поступаешь для каждой вложенной папки.
Должно сработать. Даже дельфи не надо.

Последний раз редактировалось Johnnie Walker; 22.12.2004 в 19:21.
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 23.12.2004, 08:02   [включить плавающее окно]   #3
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Цитата (Andrewk) »
Есть проблема.
Надо создать список всех файлов содержащихся в папке и во всех подпапках.
//----------------пример
file.txt
rgb/gon/1.jpg | 17.08.04
.........

сначала путь потом дата создания.
Как это сделать?
Есть такой сайт www.podgoretsky.com. Там есть FAQ конференции fido7.ru.delphi. Ответ на твой вопрос #158.
http://podgoretsky.com/ftp/Language/...lphi.html#N158
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.12.2004, 15:42   [включить плавающее окно]   #4
legozaur
Мужской Общительный
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Andrewk
Привожу пример решения реально вставшей передомной задачи поиска и переименования файлов.
Приведённый нидже код, на мой взгляд не сложно модифицировать для поставленной тобой задачи.
Код:
procedure RenameFiles(Directory : String);
label 1;
var F : TSearchRec;
    NewName : String;
begin
  if (FindFirst(Directory+'\*.'+Extr, faAnyfile, F) = 0) then begin
    NewName := Directory+'\'+F.Name;
    Delete(NewName, pos('.', Newname), Length(Newname));
    NewName := NewName +'.' +ToExtr;
    if FileExists(NewName) then begin
      if CheckBox1.Checked then
        Application.MessageBox(pChar('Невозможно переименовать файл '+Directory+'\'+F.Name+' в '+NewName+' т. к. файл с указанным именем существует'), 'Предупреждение', MB_OK+MB_ICONINFORMATION);
      goto 1;
    end;
    try
      Renamefile(Directory+'\'+F.Name, NewName);
    except
    end;
    Memo1.Lines.Add(Directory+'\'+F.Name+' в '+NewName); //Операции по информированию пользователя о переименовании
    Label6.Caption := F.Name;  //
    inc(FilesCount);  //
    Label8.Caption := IntToStr(FilesCount); //
    Application.ProcessMessages; // Обработка накопившихся событий
        1: while (FindNext(F) = 0) do begin
      NewName := Directory+'\'+F.Name;
      Delete(NewName, pos('.', Newname), Length(Newname));
      NewName := NewName +'.'+ ToExtr;
      if FileExists(NewName) then begin
        if CheckBox1.Checked then
          Application.MessageBox(pChar('Невозможно переименовать файл '+Directory+'\'+F.Name+' в '+NewName+' т. к. файл с указанным именем существует'), 'Предупреждение', MB_OK+MB_ICONINFORMATION);
        Continue;
      end;
      try
        Renamefile(Directory+'\'+F.Name, NewName);
      except
      end;
      Memo1.Lines.Add(Directory+'\'+F.Name+' в '+NewName);
      Label6.Caption := F.Name;
      inc(FilesCount);
      Application.ProcessMessages;
      Label8.Caption := IntToStr(FilesCount);
    end; {while}
  end; {FindFirst File}
  if FindFirst(Directory+'\*.*', faDirectory, F) = 0 then begin
      if ((F.Attr and faDirectory) <> 0) and
          (F.Name <> '.') and (F.Name <> '..') then
                RenameFiles(Directory+'\'+F.Name);
      while FindNext(F) = 0 do
        if ((F.Attr and faDirectory) <> 0) and
           (F.Name <> '.') and (F.Name <> '..') then
                RenameFiles(Directory+'\'+F.Name);
  end; {FindFirst Directory}
end;
В обработчике щелчка по кнопке "Переименовать!"
Код:
var path : string;
    F : TSearchRec;
    DirName : String;
    i : integer;
begin
  Memo1.Lines.Clear;
  if Application.MessageBox('Будут переименованы все файлы, которые содержатся в текущем каталоге и подкаталогах', 'Предупреждение', MB_YESNO+MB_ICONQUESTION) = IDNo then Abort;
  ExitButton.Enabled := false;
  Stop.Enabled := true;
  FilesCount := 0;
  path := FilesDir.Directory;
  //Обработка случая диска
  if path[length(path)] = '\' then
     delete(path, length(path), 1);
  RenameFiles(path+DirName);   //Вызов вышеописанной процедуры
  Label8.Caption := IntToStr(FilesCount)+' файлов';
  if FilesCount = 0 then begin
    Application.MessageBox('Нет файлов данного вида', 'Сообщение', MB_OK+MB_ICONINFORMATION);
    Button1.Enabled := false
  end
    else begin
      Application.MessageBox(PChar('Успешно переименовано '+inttostr(filescount)+' файлов'), 'Сообщение', MB_OK+MB_ICONINFORMATION);
      Button1.Enabled := true;
    end;
  Stop.Enabled := false;
  ExitButton.Enabled := true;
end;
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 23.12.2004, 16:58   [включить плавающее окно]   #5
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
legozaur, в коде есть ошибки, потенциальные проблемы, да и goto радует
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 23.12.2004, 18:33   [включить плавающее окно]   #6
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Вот пример поиска всех файлов в указанном подкаталоге и его подкаталогах. Причем без рекурсии и без goto . Программе в качестве единственного параметра надо передать каталог в котором следует производить поиск. Запусти и ужаснись количеству файлов на машине.

legozaur goto это круто... придешь на работу программистом устраиваться, попросят тест написать, как goto увидят... все... считай не устроился.

Код:
program printdir;
{$APPTYPE CONSOLE}

uses
	SysUtils, Classes;

function GetDirList(const RootDir:String):TStrings;
var
	Directories:TStrings;
	CurrentDirIndex:Integer;
	CurrentDirName,SearchPath,FoundFileName:String;
	R:TSearchRec;
begin
	Directories:=TStringList.Create;
	try
		Result:=TStringList.Create;
		try
			Directories.Append(RootDir);
			CurrentDirIndex:=0;
			repeat
				CurrentDirName:=IncludeTrailingPathDelimiter(Directories[CurrentDirIndex]);
				WriteLn(CurrentDirName); 
				SearchPath:=CurrentDirName+'*.*';
				if FindFirst(SearchPath,faAnyFile,R)=0 then
					try
						repeat
							if (R.Name<>'.') and (R.Name<>'..') then
								begin
									FoundFileName:=CurrentDirName+R.Name;
									if R.Attr and faDirectory<>0 then
										Directories.Append(FoundFileName)
									else
										Result.Append(FoundFileName);
								end;
						until FindNext(R)<>0;
					finally
						FindClose(R);
					end;
				Inc(CurrentDirIndex);
			until CurrentDirIndex>=Directories.Count;
		except
			FreeAndNil(Result);
			raise;
		end;
	finally
		Directories.Free;
	end;
end;

var
	Files:TStrings;
	I:Integer;
begin
	Files:=GetDirList(ParamStr(1));
	try
		if Files<>NIL then
			for I:=0 to Files.Count-1 do WriteLn(Files[I]);
	finally
		Files.Free;
	end;
end.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.12.2004, 12:20   [включить плавающее окно]   #7
legozaur
Мужской Общительный
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Господа соискатели!
Я отвечу, на столь прогрессивную критику, тем, что блок, в котором находится пресловутый GOTO был дописан мною несколько позже, чем остальной код, этим и объясняется некоторая "неправильность" данного фрагмента листинга.
Не разделяю принятого в некоторых кругах мнения, что этот скромный оператор полностью изжил себя (впрочим - это индивидуальное мнение, которое прежде всего формируется из опыта).
Но если уж говорить о некотором критерии "стиля", то мне было банально лень править уже отлаженный текст и я ограничился некоторым упрощением.
Также хотелось бы отметить, что данный кусок текста прогрммы не относится непосредственно к задаче поиска файлов.
Насчёт работоспособности, могу сказать одно: программа вне всякого сомнения работает, и при том, люди, которым она понадобилась (далеко не хакеры), ни на что не жалуются.
На счёт "устроиться на работу". Ну где, милостивый государь, вы видели фирму, сотрудники которой будут утруждать себя тем, что будут копаться в вашем коде с целью выявить какие-то стилистические ошибки? Уж скорее будут судить по работоспособности откомпилированного приложения.
За сим позвольте откланяться.
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.12.2004, 14:07   [включить плавающее окно]   #8
Andrewk
Мужской Интересующийся
Автор темы
 
Регистрация: 12.07.2004
Адрес: Новосибирск
Мне работать ещё не скоро, лет эдак через 5.
Доучусь сначала и т.д.
А за код и ссылки спасибо.
Andrewk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.12.2004, 16:10   [включить плавающее окно]   #9
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Цитата (legozaur) »
Я отвечу, на столь прогрессивную критику, тем, что блок, в котором находится пресловутый GOTO был дописан мною несколько позже, чем остальной код, этим и объясняется некоторая "неправильность" данного фрагмента листинга.
Не разделяю принятого в некоторых кругах мнения, что этот скромный оператор полностью изжил себя (впрочим - это индивидуальное мнение, которое прежде всего формируется из опыта).
Это не прогрессивная критика, это давно известный всем принцип. Это не принятое в некоторых кругах мнение. Есть теоретические обоснования, которые утверждают что любая программа обладающая тремя языковыми конструкциями - последовательное выполнение, ветвление и цикл может быть написана без goto. Использование goto не просто "плохой стиль", это "небрежность помноженная на безграмотность".
Цитата (legozaur) »
Но если уж говорить о некотором критерии "стиля", то мне было банально лень править уже отлаженный текст и я ограничился некоторым упрощением.
Также хотелось бы отметить, что данный кусок текста прогрммы не относится непосредственно к задаче поиска файлов.
Насчёт работоспособности, могу сказать одно: программа вне всякого сомнения работает, и при том, люди, которым она понадобилась (далеко не хакеры), ни на что не жалуются.
Так программирование на профессиональном уровне и состоит частично в том что таких вот "упрощений" быть не должно. Потому что при современном - промышленном масштабе производства софта, единственная возможность не быть погребенным под кучей ошибок и глюков - писать правильно всегда.
Цитата (legozaur) »
На счёт "устроиться на работу". Ну где, милостивый государь, вы видели фирму, сотрудники которой будут утруждать себя тем, что будут копаться в вашем коде с целью выявить какие-то стилистические ошибки? Уж скорее будут судить по работоспособности откомпилированного приложения. За сим позвольте откланяться.
Представь себе видел. И не раз. И самого меня так проверяли. Проверка бывает такая что дают очень простую, предельно детерминированную, задачу, которую нужно решить в течение короткого промежутка времени. От пары часов, до пары суток. Причем правильное и оптимальное решение задачи (ее суть, главный алгоритм) как правило укладывается от пятидесяти до пары сотен строк. А потом другой программист посмотрит и скажет: "Тэ-э-кс. А почему здесь сортировка пузырьком а не квиксорт? А здесь зачем такое сложность, можно было-бы проще решить? А тут вот функция может вернуть такой-то нехороший результат, а вы не проверяете, сломается программа. А зачем эти все структуры держатся в памяти, когда их можно не держать и при этом не проигрывать в производительности." Ну и тому подобное. Проверят по большому счету три вещи - решена-ли задача, насколько решение близко к оптимальному, насколько надежно решение (т.е. устойчивость его в граничных ситуациях или в ситуациях когда исходные данные заведомо неверны).

P.S. Кстати пустой except...end тоже не воодушевляет, независимо от места и условий его применения.

Последний раз редактировалось ender; 24.12.2004 в 16:17.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 24.12.2004, 16:26   [включить плавающее окно]   #10
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
Цитата (legozaur) »
Насчёт работоспособности, могу сказать одно: программа вне всякого сомнения работает
Примените ее к папке с файлами, в именах которых есть точки (типа file.blah.ext), и увидите, как она работает. Это то, что я увидел в первые 5 секунд, наверное, можно еще накопать.

Последний раз редактировалось Johnnie Walker; 24.12.2004 в 16:28.
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 25.12.2004, 13:09   [включить плавающее окно]   #11
Andrewk
Мужской Интересующийся
Автор темы
 
Регистрация: 12.07.2004
Адрес: Новосибирск
Как узнать дату создания файла?
Andrewk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 25.12.2004, 15:03   [включить плавающее окно]   #12
legozaur
Мужской Общительный
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Johnnie Walker
Ok, убедил!
Лядно, прости, что вышло резковато, я просто был не в духе.
Полностью поддерживаю идею насчёт того, что надо всегда и везде писать правильно. В конце концов из этого и формируется культура программирования.
Т. ч. признаю замечание насчёт GOTO справедливым.
tray..except остались случайно (уже и не помню зачем они были нужны).
Слушай, Andrewk, ты извени, что такую сыротень выложил, но просто времени вылизывать не было, а помочь хотелось.
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 25.12.2004, 20:14   [включить плавающее окно]   #13
Andrewk
Мужской Интересующийся
Автор темы
 
Регистрация: 12.07.2004
Адрес: Новосибирск
legozaur
Да ладно. Х_ен с ним.
Я уже написал своё на основе FAQ из ru.delphi.
Всем спасибо ешё раз.
Andrewk вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 27.12.2004, 19:37   [включить плавающее окно]   #14
ender
Мужской Интересующийся
 
Аватар для ender
 
Регистрация: 01.07.2004
Цитата (Andrewk) »
Как узнать дату создания файла?
В TSearchRec кажется есть соответствующее поле, если я еще помню чего там есть.
ender вне форума  
Конфигурация ПК
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 07:06. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey