Newsgroup: it.comp.lang.delphi
Titolo: Gestione file

Ciao a tutti
come posso gestire una directory tramite un intero???
mi spiego meglio :
 1= percorso primo file
 2=percorso secondo....
avevo pensato tramite un vettore ma non ho ben
capito come fare mi aiutate???
grazie

  2=percorso secondo....
Ehm, non so se ho capito, ma se vuoi avere una lista di file indicizzata,
puoi usare benissimo una stringlist, caricandola a run-time:
var
    sr: TSearchRec;
    slDir: TStringList;
    i: Integer;
begin
    slDir := TStringList.Create;
    i := FindFirst('c:\*.*', (faReadOnly + faHidden + faSysFile), sr);
    while i = 0 do
    begin
        slDir.Add(sr.Name);
        i := FindNext(sr);
    end;
    FindClose(sr);
// in questo modo potrai riferirti ai vari file come slDir[0],
slDir[1].......
    ListBox1.Items.AddStrings(slDir);
    slDir.Free;
end;
--
Jax
Journeying Artificial Xenomorph

capito come fare mi aiutate???
Usa una TStringList.
var
  F: TSearchRec;
begin
  if FindFirst('C:\*.*', faAnyFile, F) = 0 then
  begin 
    repeat 
      S.Add(F.Name);
    until FindNext(F) <> 0;    
  end;
  FindClose(F);
end.
-- 
Andrea Laforgia
"God is dead." -- Nietzsche
"Nietzsche is dead." -- God

    slDir.Free;
end;


 try
O__O
Maria, ma chi sei... manco un minuto dopo!
Comunque sì, io ce lo metto sempre, ma l'ho scritto al volo :P


     repeat
Figata, avevo già provato ad eliminare la variabile di return ma non avevo
pensato ad un if + repeat.


Comunque sì, io ce lo metto sempre, ma l'ho scritto al volo :P
Il problema è che spesso dai codici di esempio si imparano le regole
generali ed è bene prestare attenzione alle deallocazioni esplicite,
quando servono.


"Jax" <rispo...@newsgroup.grazie> ha scritto nel messaggio
news:PL84a.194136$0v.53...@news1.tin.it...

uses DateUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TSearchRec;
  S:TStringList;
  Tempo,Tempo1:TDateTime;
  i:longint;
  i1:word;
begin
  Tempo:=Now;
  S:=TStringList.Create;
  try
  for i:=1 to 200 do
  begin
  i1:=FindFirst('C:\WINDOWS\*.*', faAnyFile, F);
  while i1<>0 do
  begin
    S.Add(F.Name);
    i1:=FindNext(F);
  end;
  FindClose(F);
  end;
  finally
  S.Free;
  end;
  Tempo:=Now-Tempo;
  Tempo1:=Now;
  S:=TStringList.Create;
  try
  for i:=1 to 200 do
  begin
  if FindFirst('C:\WINDOWS\*.*', faAnyFile, F)=0 then
  begin
    repeat
      S.Add(F.Name);
    until FindNext(F) <> 0;
  end;
  FindClose(F);
  end;
  finally
  S.Free;
  end;
  Tempo1:=Now-Tempo1;
  Button1.Caption:=FormatFloat('0,.0000',(Tempo)/OneSecond)+' '+
   FormatFloat('0,.0000',(Tempo1)/OneSecond);
end;
Nel mio computer la versione con la variabile i1 è 10 volte + veloce, non
sempre eliminando variabili si ottengono performance superiori :))
Ciao
Giorgio


dove viene incrementato il file x inserirlo nella lista??

"Jax" <rispo...@newsgroup.grazie> ha scritto nel messaggio
news:_F84a.194084$0v.53...@news1.tin.it...

Il tuo codice mi da questi errori di compilazione :
[Warning] Unit1.pas(85): Symbol 'faReadOnly' is specific to a platform
[Warning] Unit1.pas(85): Symbol 'faHidden' is specific to a platform
[Warning] Unit1.pas(85): Symbol 'faSysFile' is specific to a platform


Non sono errori bensģ *avvertimenti*, indicano, come si evince dal testo,
che quel codice non č trasportabile su altre piattaforme.
Gianluca.

 dove viene incrementato il file x inserirlo nella lista??
Mi sa che hai le idee un po' confuse. "Incrementare un file" non ha senso.
Ogni volta che inserisci una stringa in una StringList, questa stringa avrà
un indice, che sarà 0 se la stringlist era vuota, poi 1, 2 e così via, e
quindi poi potrai accederci con slLista[0], slLista[1]...
Se non è questo che vuoi, cerca di spiegarti un po' meglio altrimenti a
Pasqua siamo ancora qua :)


  while i1<>0 do
Questo codice è sbagliato.
  if FindFirst('C:\WINDOWS\*.*', faAnyFile, F) = 0
equivale a:
  if i1 = 0 
La velocità dei due codici, sulla mia macchina, è identica.


   while i1<>0 do
Te credo che è più veloce, trova un file e basta :D


 sempre eliminando variabili si ottengono performance superiori :))
Prova ad invertire l'ordine delle prove, o meglio, a farle in due
handler separati: a me vengono valori congruenti (3035 ms, 3024 ms con
un numero di righe di circa 99000)
Quanto al punto originale, ora che sono state rilasciate OpenSource, e'
consigliabile dare un'occhiata alle SysTools di TurboPower (su
sourceforge.net
).
Tra le altre cose, c'e' un'utile funzione che consente di visitare anche
le subdir, con una callback che consente di validare ogni singolo file.
Oltre al codice, e' rilasciata anche la documentazione (manuale di oltre
1100 pagine, help) fatta molto bene (era un prodotto commerciale da
circa 400 talleri).
Saluti
Paolo Arosio

le subdir, con una callback che consente di validare ogni singolo file.
Ne avevo fatta una cosě anch'io:
type
  TSearchCallback = function(F: TSearchRec): Boolean;
function MyCallBack(F: TSearchRec): Boolean;
var
  FileName: String;
begin
  FileName := UpperCase(ExpandFileName(F.Name));
  Form1.ListBox2.Items.Add(FileName);
  if UpperCase(ExtractFileExt(FileName)) = '.TXT' then
    Form1.ListBox1.Items.Add(FileName);
  Result := True;
end;
procedure SearchInFolder(const Folder: String;
                         CallBackPtr: TSearchCallBack;
                         SearchInSubFolders: Boolean);
  procedure SearchInSubFolder(const SubFolder: String);
  var
    F: TSearchRec;
    CallBackResult: Boolean;
  begin
    ChDir(SubFolder);
    if FindFirst('*.*', faAnyFile, F) = 0 then
    begin
      repeat
        if Assigned(CallBackPtr) then
          CallBackResult := CallBackPtr(F)
        else
          CallBackResult := True;
        if (CallBackResult) then
        begin
          if (SearchInSubFolders) and
             (F.Name[1] <> '.') and
             ((F.Attr and faDirectory) <> 0) then
            SearchInSubFolder(F.Name);
        end;
      until ((not CallBackResult) or (FindNext(F) <> 0));
    end;
    ChDir('..');
  end;
begin
  SearchInSubFolder(Folder);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  SearchInFolder('D:\Programmi\Borland\Delphi6', @MyCallBack, True);
end;


 Ne avevo fatta una cosě anch'io:
[cut]
Un paio di considerazioni: il terzo parametro di SearchInFolder e' (ha
un nome) poco distinguibile dalla procedura locale.
Inoltre, mi pare che se entri nella Callback con una directory questa ti
ritorna false quando riceve il SR di una directory, quindi non esplori,
di fatto, tutti i rami (ma forse e' voluto).
(infine, ma questa e' solo una preferenza personale, prediligo i while
ai repeat..until)
Saluti
Paolo Arosio

 Ne avevo fatta una cosě anch'io:
[cut]
Un paio di considerazioni: il terzo parametro di SearchInFolder e' (ha
un nome) poco distinguibile dalla procedura locale.
Inoltre, mi pare che se entri nella Callback con una directory questa ti
ritorna false quando riceve il SR di una directory, quindi non esplori,
di fatto, tutti i rami (ma forse e' voluto).
(infine, ma questa e' solo una preferenza personale, preferisco i while
rispetto ai repeat..until)
Saluti
Paolo Arosio

rispetto ai repeat..until)
Questione di gusti.  Nel caso specifico di FindFirst/FindNext mi
risulta molto piů comodo usare un controllo booleano "a valle".


    end;
finally
  FindClose(F);
  ChDir('..');


"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:mjt35v4ritlkehorv...@4ax.com...

E' vero hai ragione, dovrebbe essere "while i1=0 do" e in effetti le
velocità sono le stesse.
L'ora non era delle migliori per fare certe considerazioni :)
Ciao
Giorgio


Hai ragione, avevo male interpretato il codice.
Saluti
Paolo Arosio