"Pojemnosc" OpenDialog.Files

0

Mam problem z wczytywaniem plikow przez OpenDialog. Szukalem na forum, przejrzalem faq, artykuly, gotowce. Grzebalem rowniez na innych stronach. Niestety bez powodzenia. Co prawda, moge wczytac pliki w inny sposob, jednak mi chodzi konkretnie o OpenDialog.

Przykladowo, tworze "kilka" plikow :

var
  i: integer;
  F: TextFile;
begin
  for i := 0 to 2000 do
  begin
    AssignFile(F, 'c:\temp\adasdfasfasfasfasfasdfasfasfas' + IntToStr(i) + '.txt');
    Rewrite(F);
    CloseFile(F);
  end;
end;

Nastepnie, probuje wczytac :

var
  i: integer;
begin
  if OpenDialog1.Execute then
    for i := 0 to OpenDialog1.Files.Count - 1 do
      ListBox1.Items.Append(OpenDialog1.Files.Strings[i]);
end;

Laduje sie tylko czesc plikow.

Czy to jest normalne ? Czy mozna cos z tym zrobic ?

0

TOpenDialog.Files

Returns a list of the selected file names.

property Files: TStrings;

Description

Files is a string list that contains each selected file name with its full directory path. (To let users select multiple file names, set the ofAllowMultiSelect flag in Options.) Use properties and methods for string lists to traverse this list of files and read individual items.

The example below assigns the list of files in Files to the Items property of a TListBox component.

ListBox1.Items.Assign(OpenDialog1.Files);

No właśnie.
A jak uzyskać dostęp do wszystkich plików które były widoczne w OpenDialog?

0

mój program ładuje ponad 2000 plików więc o żadnym limicie nie może być mowy (więcej jak w 'windows\system32' -2114 plików nie wiem gdzie szukać i mi się nie chce).
ale. 1sze co zrób to zmień nazwy plików na:

AssignFile(F, 'c:\temp\IntToStr(i) + '.txt');

...na przykład.

no i:

ListBox1.Items.AddStrings(OpenDialog1.Files);
//albo
ListBox1.Items.Assign(OpenDialog1.Files);

[EDIT]
@pelsta:
co dokładnie masz na myśli ? może wystarczy się pobawić opcjami TOpenDialog ?

0

Wczytaj ze wskazanego folderu, wszystkie w nim zawarte pliki...

uses ShlObj, ShellApi;

public
  procedure ZnajdzPlik(Sciezka,NazwaPliku:String);


procedure TForm1.ZnajdzPlik(Sciezka, NazwaPliku : String);
var
 FSearchRec, DSearchRec : TSearchRec;
 FindResult : Integer;
begin
 if Sciezka[Length(Sciezka)] <> '\' then Sciezka := Sciezka + '\';
FindResult := FindFirst(Sciezka + NazwaPliku, faAnyFile + faHidden + faSysFile + faReadOnly, FSearchRec);
 try
  while FindResult = 0 do
    begin
     ListBox1.Items.Add(Sciezka + FsearchRec.Name);
     FindResult := FindNext(FSearchRec);
    end;

  Application.ProcessMessages;
  FindResult := FindFirst(Sciezka + '*.*', faDirectory + faHidden, DSearchRec);
  while FindResult=0 do
    begin
     if ((DSearchRec.Attr and faDirectory) = faDirectory) and ((DSearchRec.Name <> '.') and (DSearchRec.Name <> '..')) then ZnajdzPlik(Sciezka+DSearchRec.Name,NazwaPliku);
     FindResult:=FindNext(DSearchRec);
    end;

 finally
  FindClose(FSearchRec);
  FindClose(DSearchRec);
 end;
end;

Wykorzystanie:
wskazany folder zostanie przeszukany, a jego zawartość to wszystkie pliki dodane do ListBox1.

var
 Bro   : BROWSEINFO;
 ItemID: PITEMIDLIST;
 Result: array[1..MAX_PATH] of Char;
begin
 Bro.hwndOwner      := Handle;
 Bro.pidlRoot       := nil;
 Bro.pszDisplayName := @Result;
 Bro.lpszTitle      := 'Wskaż folder';
 Bro.ulFlags        := 0;
 Bro.lpfn           := nil;
 Bro.lParam         := 0;
 Bro.iImage         := 0;
 ItemID := SHBrowseForFolder(Bro);
 if ItemID <> nil then
   if SHGetPathFromIDList(ItemID, @Result) = True then ZnajdzPlik(Result + '\','*.*');
end;
0
snw napisał(a)

@pelsta:
co dokładnie masz na myśli ? może wystarczy się pobawić opcjami TOpenDialog ?

Mam na myśli to, że zgodnie z opisem w Helpie (używam Delphi6) TOpenDialog.Files zawiera jedynie pliki, które użytkownik wybrał z okna dialogowego a nie wszystkie, które znajdują się w przeglądanym katalogu. Nie znalazłem żadnej opcji, która miałaby na to wpływ.

ps

Do wskazania folderu bardzo wygodna w użyciu jest funkcja

function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;
0

@pelsta:
obawiam się, że to niemożliwe w ramach tego komponentu, w takiej postaci jak jest.

0

@snw

Ten kod :

var
  i: integer;
begin
  if OpenDialog1.Execute then
    for i := 0 to OpenDialog1.Files.Count - 1 do
      ListBox1.Items.Append(OpenDialog1.Files.Strings[i]);
end;

rowniez i u mnie wczyta ponad 2000 plikow z system32. Mysle, ze jeszcze pare tysiecy w 8.3 i rowniez by nie zaladowal. Jak mozesz to sprawdz, czy u Ciebie wczytaja sie wszystkie pliki zrobione tym sposobem :

var
  i: integer;
  F: TextFile;
begin
  for i := 0 to 2000 do
  begin
    AssignFile(F, 'c:\temp\adasdfasfasfasfasfasdfasfasfas' + IntToStr(i) + '.txt');
    Rewrite(F);
    CloseFile(F);
  end;
end;

To :

ListBox1.Items.AddStrings(OpenDialog1.Files);
//albo
ListBox1.Items.Assign(OpenDialog1.Files);

nic nie da. Po zaznaczeniu 2k x adasdfasfasfasfasfasdfasfasfas, OpenDialog.Files.Count - wskazuje 822.

@Opi, dzieki za kodzik, ale jak napisalem wyzej - moge wczytac pliki w inny sposob, jednak mi chodzi konkretnie o OpenDialog.

0

To zamiast x tysięcy plików użyj jednego albo kilku. Po co komu dzielić dane na tyyyyle plików.

0

Tak sie wlasnie sklada, ze potrzebuje "obrabiac" duze ilosci plikow / z dlugimi nazwami. Troche to dziwne, przeciez lista wczytanych plikow siedzi w TStrings - wiec bez problemow powinno sie zmiescic 2k x adasdfasfasfasfasfasdfasfasfas. Moze ktos wie o komponencie dzialajacym na wzor OpenDialog - prosze o info.

1 użytkowników online, w tym zalogowanych: 0, gości: 1