Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проверка содержимого папки...


Автор: IamDreamer 3.2.2006, 13:26
Как проверить пуста ли директория (не всякими FindFirst'ами)? И как узнать последний ли текущий файл в директории?

Автор: Rennigth 3.2.2006, 13:33
Цитата(IamDreamer @ 3.2.2006, 13:26 Найти цитируемый пост)

не всякими FindFirst'ами

Чем не устраивает?
Добавлено @ 13:38
Винда думаешь как-то по другому это делает? FindFirst, FindNext - просто обертка техже виндовых методов.
Добавлено @ 13:39
Цитата(IamDreamer @ 3.2.2006, 13:26 Найти цитируемый пост)

текущий файл в директории

что ты имеешь ввиду текущим?

Автор: Romikgy 3.2.2006, 14:10
Код

SendMessage(ListBox1.Handle,LB_DIR,DDL_READWRITE,PChar('C:\'));

Автор: IamDreamer 3.2.2006, 17:50
Цитата(Rennigth @ 3.2.2006, 13:33)
что ты имеешь ввиду текущим?

Короче хочу сделать переименовальщик (самому лень переименовывать), типа, допустим, все фотки будут иметь имя "001", "002" и т.д. Вот, задаешь папку и, если она непуста (как это проверить), то начинает их (файлы) переименовывать. Дык как проверить (или это не надо) является последний переименованный файл последним в папке?

Автор: Romikgy 3.2.2006, 17:56
Имхо загнал в листбокс все файлы, а далее с этим списком и работаешь, без проверок на посл. файл или нет.

Автор: IamDreamer 3.2.2006, 18:06
Цитата(Romikgy @ 3.2.2006, 17:56)
Имхо загнал в листбокс все файлы, а далее с этим списком и работаешь, без проверок на посл. файл или нет.

А как с ним работать?
Код

...
FileListBox1.FileName := '';
...

Мало к чему приводит, а именно к ошибке.

Автор: Albinos_x 3.2.2006, 18:31
Цитата(IamDreamer @ 3.2.2006, 17:50 Найти цитируемый пост)

Дык как проверить (или это не надо) является последний переименованный файл последним в папке?

непонятно зачем это нужно?
Цитата(IamDreamer @ 3.2.2006, 18:06 Найти цитируемый пост)

...
FileListBox1.FileName := '';
...

Мало к чему приводит, а именно к ошибке.

конечно... такого пути нет....
Цитата(IamDreamer @ 3.2.2006, 18:06 Найти цитируемый пост)

А как с ним работать?

предлогают загнать в обчный ListBox....:
Код
...
// код в котором записываешь в личбокс файлы из папки с помощью FindFirst
...
if ListBox1.Count=0 then
  begin
  // действия если файлов папке нет
  end
  else
  begin
  // переименовываем файлы
  for i:=0 to (ListBox1.Count-1) do  // цикл по всем файлам
     if i<>ListBox1.Count-1 then     // если файл не последний
        RenameFile(ListBox1.Items[i],(Inttostr(I+1)+ExtractFileExt(ListBox1.Items[i])))
        else                                     // если файл последний
         {твои действия если файл последний};
  end;
...

Добавлено @ 18:41
Тоже самое можно проделать и с FileListBox
Код

...    
if FileListBox1.Count=0 then    
  begin    
  // действия если файлов папке нет    
  end    
  else    
  begin    
  // переименовываем файлы    
  for i:=0 to (FileListBox1.Count-1) do  // цикл по всем файлам    
     if i<>FileListBox1.Count-1 then     // если файл не последний    
        RenameFile(FileListBox1.Directory+'\'+FileListBox1.Items[i],(Inttostr(I+1)+ExtractFileExt(FileListBox1.Directory+'\'+FileListBox1.Items[i])))    
        else                                     // если файл последний    
         {твои действия если файл последний};    
  end;    
...

Автор: IamDreamer 4.2.2006, 19:13
Цитата(Albinos_x @ 3.02.2006,18:31)
Код

     RenameFile(ListBox1.Items[i],(Inttostr(I+1)+ExtractFileExt(ListBox1.Items[i])))

Нельзя ли заменить на
Код

...
Rename(FileListBox1.Items[i], '00'+IntToStr(i+1));
...

И что такое ExtractFileExt(ListBox1.Items[i]?

Автор: Albinos_x 4.2.2006, 19:54
Цитата(IamDreamer @ 4.2.2006, 19:13 Найти цитируемый пост)

И что такое ExtractFileExt(ListBox1.Items[i])?

получение расширения файла...
тогда в твоём случае:
Код

RenameFile(ListBox1.Items[i],('00'+Inttostr(I+1)+ExtractFileExt(ListBox1.Items[i])))

как понял из предыдущего поста, то тебе обязательно нужно 3-х значное число тогда:
Код

var val:string;
      i:word;
...
...
val:=Inttostr(I+1);
case length(val) of
    1 : val:='00'+val;
    2 : val:='0'+val;
   end;
val:=val+ExtractFileExt(ListBox1.Items[i]);
RenameFile(ListBox1.Items[i],val);
...

Автор: IamDreamer 4.2.2006, 20:00
Albinos_x:
А что возвращает функция ExtractFileExt? Она же Integer.

Автор: Albinos_x 4.2.2006, 20:05
Цитата

function ExtractFileExt(const FileName: string): string; 
 
Извлекает из строки с полным именем файла FileName часть, содержащую его расширение. 


Автор: IamDreamer 4.2.2006, 21:00
А почему при использовании Rename'a получается следующее: старое имя: img_001, новое (после ренейма) 000.jpg1, а расширение файла остается .jpg.
Код

Var i: Integer;
s: string;
begin
  for i:= 0 to FileListBox1.Count-1 do
    begin
       s:= s+IntToStr(i);
       case length(s) of
       1: s:= '000' ;
       2: s:= '00'+s;
       3: s:= '0' +s;
       end;
       s:= s+ExtractFileExt(FileListBox1.Items[i]);
       RenameFile(FileListBox1.Items[i],s);
    end;

К моему предыдущему сообщению: извиняюсь, не то спросил, имел ввиду FileListBox1.Items.

Автор: Демо 4.2.2006, 21:13
И чем тебя FindFirst/FindNext/FindClose не устроил?
Пишется всё буквально за 10-15 минут:

Код

{$WARN SYMBOL_PLATFORM OFF}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Masks;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Поиск файлов в каталоге и его покаталогах с фильтром по маске и исключением
//из поиска всех файлов, атрибуты которых попадают в aExcludeAttr
procedure GetFiles(const aPath,aMask: String;var aListFile: TStringList;const aExcludeAttr: Integer=0);
var
  SR: TSearchRec;
  tPath: String;
begin
  tPath := IncludeTrailingBackSlash(aPath);
  if FindFirst(tPath+'*.*',faAnyFile,SR)=0 then
  begin
    try
      repeat
        if (SR.Name='.') or (SR.Name='..') then Continue;
        if (SR.Attr and faDirectory)<>0 then GetFiles(tPath+SR.Name,aMask,aListFile,aExcludeAttr);
        if (aExcludeAttr<>0) and (SR.Attr and aExcludeAttr <> 0) then Continue;
        if MatchesMask(SR.Name,aMask) then aListFile.Add(tPath+SR.Name);
      until FindNext(SR)<>0;
    finally
      Sysutils.FindClose(SR);
    end;
  end;
end;


function RenFiles(const SrcPath,DestPath,Mask: String;isMove: Boolean=False): Integer;
var
  L: TStringList;
  i: Integer;
  DestFile: String;
begin
  Result := 0;
  try
    if not DirectoryExists(DestPath) then
    begin
      if not CreateDir(DestPath) then Exit;
    end;
  except
    Exit;
  end;
  L := TStringList.Create;
  try
    GetFiles(SrcPath,Mask,L);
    for i := 0 to L.Count-2 do
    begin
      DestFile := ExtractFileName(L[i]);
      DestFile := ChangeFileExt(DestFile,'.'+Format('%d',[i+1]));
      DestFile := IncludeTrailingBackSlash(DestPath)+DestFile;
      if isMove
        then MoveFile(PChar(L[i]),PChar(DestFile))
        else CopyFile(PChar(L[i]),PChar(DestFile),False);
    end;
    //Здесь обрабатываем последний файл (L[L.Count-1])
  finally
    L.Free;
  end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RenFiles('d:\mp1','d:\mp2','*.jpg',False);
end;

end.


Автор: Albinos_x 4.2.2006, 22:11
Цитата(IamDreamer @ 4.2.2006, 21:00 Найти цитируемый пост)

А почему при использовании Rename'a получается следующее: старое имя: img_001, новое (после ренейма) 000.jpg1, а расширение файла остается .jpg.

по тому что я приводил должно получаться не 000.jpg1, а 001.jpg...
расширение остаётся именно из-за функции ExtractFileExt(const FileName: string): string... если её не применять, то расширения у переименованных файлов не будет...
Цитата(IamDreamer @ 4.2.2006, 21:00 Найти цитируемый пост)

К моему предыдущему сообщению: извиняюсь, не то спросил, имел ввиду FileListBox1.Items.

не, так не получится... т.к. FileListBox1.Items[i] будет возвращять только имена файлов, а для того чтоб файл переименовать этого недостаточно... нужно знать и место его нахождения... т.е. полный путь с именем файла... для этого и нужно делать:
Код

s:=FileListBox1.Directory+'\'+FileListBox1.Items[i]

чтоб получить этот полный путь...
да ещё у меня ошибка...забыл что в строке с новым именем, тоже должен содержаться полный путьк файлу...т.е.:
Код

var val:string;    
      i:word;    
...    
...
val:=Inttostr(I+1);    
case length(val) of    
    1 : val:='00'+val;    
    2 : val:='0'+val;    
   end;    
val:=ExtractFilePath(ListBox1.Items[i])+val+ExtractFileExt(ListBox1.Items[i]);    
RenameFile(ListBox1.Items[i],val);    
...

тоже и для FileListBox:
Код
...
val:=FileListBox1.Directory+'\'+val+ExtractFileExt(FileListBox1.Items[i]);
RenameFile(FileListBox1.Directory+'\'+FileListBox1.Items[i],val);    
...

Автор: IamDreamer 12.2.2006, 19:29
А как "обновить" FileListBox? В смысле, чтобы после переименовывания он показал файлы с новым именем.

Автор: Int64 12.2.2006, 19:54
Цитата(IamDreamer @ 12.2.2006, 19:29)
А как "обновить" FileListBox? В смысле, чтобы после переименовывания он показал файлы с новым именем.

Refresh

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)