Autor Téma: Nedaří se mi načíst data  (Přečteno 792 krát)

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Nedaří se mi načíst data
« kdy: 16-09-2018, 19:03:45 »
Kód: Delphi [Vybrat]
  1. SubDirs, FileList, line, TargetFile: TStringList;
  2. m, n: integer;
  3. FileHandle : Integer;
  4. fSize: Integer;
  5.  
  6. begin
  7.  
  8.   SourceList := TStringList.create;
  9.   FileList := TStringList.create;
  10.   TargetFile := TStringList.create;
  11.   SubDirs := TStringList.create;
  12.  
  13.   createDirsList('b:\html', SubDirs);
  14.  
  15.   if not DirectoryExists('b:\output.html') then
  16.     mkdir('b:\output.html');
  17.   for m:=0 to SubDirs.count-1 do
  18.     begin
  19.     FileList.clear;
  20.     createFilesList('b:\html\' + SubDirs[m] , '.htm', FileList);
  21.     s := 'b:\output.html\' + SubDirs[m];
  22.     if not DirectoryExists(s) then
  23.       mkdir(s);
  24.   for i:=0 to FileList.count-1 do
  25.     begin
  26.       SourceList.clear;
  27.       TargetFile.clear;
  28.  
  29.       FileHandle := FileOpen('b:\html\' + SubDirs[m] + '\' + FileList[i], fmOpenRead);
  30.       fSize := FileSeek(FileHandle,0,soFromEnd);
  31.       FileSeek(FileHandle,0,soFromBeginning);
  32.       setLength(buffer, fSize);
  33.       FileRead(FileHandle, buffer , fSize );
  34.       setLength(buffer, ansipos('$', buffer ) );
  35.       fileclose(FileHandle);
  36.       FileHandle := FileOpen(s + '\' + FileList[i], fmOpenWrite);
  37.       FileWrite(FileHandle, buffer , fSize );
  38.       fileclose(FileHandle);
  39.  
  40.       TargetFile.SaveToFile('b:\output.html\' + SubDirs[m] + '\' + ChangeFileExt(FileList[i], '.html'));
  41.       TargetFile.clear;
  42.     end; // n loop files
  43.     end; // m loop directories
  44.  

Problematická část:

Kód: Delphi [Vybrat]
  1. setLength(buffer, fSize);
  2. FileRead(FileHandle, buffer , fSize );
  3. setLength(buffer, ansipos('$', buffer ) );
  4.  

buffer je typ string, ale když nedám setLength(buffer, fSize); tak se nic nenačte do bufferu. Když použiju seLenght tak přes kukátko vidí, že tam jsou načtené nějaké čísla, ale zdrojový soubor je html stránka, takže text. Takže se ptám co musím udělat aby to vidělo text? Já chci v souboru najít značku '$' respektive '$>' a odtud soubor zkrátit.

PS:
Jedná se o jednoúčelový kód, chci jen zkrátit soubory o marast, který je nakonci.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
Re:Nedaří se mi načíst data
« Odpověď #1 kdy: 16-09-2018, 19:57:10 »
je-li buffer string, pak se načítá od indexu 1

FileRead(FileHandle, buffer[1] , fSize );

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #2 kdy: 16-09-2018, 20:02:07 »
Díky, na toto jsem už zase zapomněl. Teď už to jede.

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #3 kdy: 16-09-2018, 20:11:29 »
Ještě dotaz,

Kód: Delphi [Vybrat]
  1. s := 'b:\output.html\' + SubDirs[m] + '\' + ChangeFileExt(FileList[i], '.html');
  2. FileHandle := FileOpen(s, fmCreate ); // or fmOpenWrite
  3.  

Chci zapsat data, soubor neexisutje, ale FileHandle je -1 . Cesta ale je v pořádku,
kde je problém?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3461
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Nedaří se mi načíst data
« Odpověď #4 kdy: 16-09-2018, 21:30:37 »
V uvedenom texte chybu nevidím. Takže mi napadajú jedine prístupové práva.
Mňa však zaujalo čosi iné. Preto aj pišem. A to v ceste uvedený disk B. V OS W sú písmená A, B vyhradené pre flopy disky a OS ich HD odmieta prideliť. Iné OS nepoznám, ale uvedný text poukazuje na W. Takže ma technicky zaujíma ako si sa k tomu B dopracoval.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 474
  • Karma: 36
    • Verze Delphi: 10.2
Re:Nedaří se mi načíst data
« Odpověď #5 kdy: 16-09-2018, 22:02:48 »
Kód: Delphi [Vybrat]
  1. s := 'b:\output.html\' + SubDirs[m] + '\' + ChangeFileExt(FileList[i], '.html');
  2. FileHandle := FileOpen(s, fmCreate ); // or fmOpenWrite

Chci zapsat data, soubor neexisutje, ale FileHandle je -1 . Cesta ale je v pořádku,
kde je problém?

Pokud celá cesta doopravdy existuje (fakt má ta složka ve svém názvu .html?), tak bych zkusil fmCreate or fmShareDenyWrite. Ale spíš bych tipoval na zradu v té cestě.

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #6 kdy: 16-09-2018, 22:22:43 »
Cesta s je 'b:\output.html\alfa\aaro_n_2.html'
ten soubor není vytvořen, má se vytvořit při zápisu dat. Jinak cesta b:\output.html\alfa\ je ok.

a: a b: jsou v mém PC ramdisky; takže vlastně "virtuální" disky. Vytváření souborů jsem už dělal, ale pomocí TStringList, což není tento případ. Používám Ramdisky často, abych množství provizorních dat zbytečně neukládal na pevný disk.

PS:
Ani toto nepomohlo:

Kód: Delphi [Vybrat]
  1. s := 'b:\test.html';
  2. FileHandle := FileOpen(s, fmCreate  or fmShareDenyWrite);
  3. [code=delphi]

Ani c:\...
« Poslední změna: 16-09-2018, 22:27:18 od vangog »

Online vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 474
  • Karma: 36
    • Verze Delphi: 10.2
Re:Nedaří se mi načíst data
« Odpověď #7 kdy: 16-09-2018, 22:25:42 »
Vytváření souborů jsem už dělal, ale pomocí TStringList, což není tento případ.

Já bych teda stejně doporučoval použít tFileStream, třeba se tím záhada vyřeší...


Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
Re:Nedaří se mi načíst data
« Odpověď #8 kdy: 17-09-2018, 08:33:35 »
Proč si to tak komplikovat?
Existuje něco jako
Kód: Delphi [Vybrat]
  1.   if DirectoryExists(ExtractFilePath(s)) then...

k ověření že cesta existuje.

  Nebo rovnou
Kód: Delphi [Vybrat]
  1.   if FileExists(s) then

jinak lze do stringlistů lehce načíst celý soubor a pak s tím pracovat nejen po řádkách ale i jako s textem v řetězci

Kód: Delphi [Vybrat]
  1. var strlst: TStringList;
  2. ...
  3.   strlst.LoadFromFile(s); //nacti
  4.   str := strlst.Text; //do retezce
  5.   ...
  6.   strlst.Text := str; //zpatky
  7.   strlst.SaveToFile(s); //uloz

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #9 kdy: 17-09-2018, 09:56:17 »
jinak lze do stringlistů lehce načíst celý soubor a pak s tím pracovat nejen po řádkách ale i jako s textem v řetězci

OK, dík za tipy.

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #10 kdy: 17-09-2018, 11:34:36 »
Přiznám se ale že používat k tomu TStringList mi přijde neefektivní vzhledem k velkému množství souborů kterých jsou tisíce.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
Re:Nedaří se mi načíst data
« Odpověď #11 kdy: 17-09-2018, 11:55:51 »
Jak vypadají ony soubory (obsah, struktura, velikost)?

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #12 kdy: 17-09-2018, 12:38:05 »
Jak vypadají ony soubory (obsah, struktura, velikost)?

Html obsahující angličtinu, řečtinu nebo hebrejštinu. Občas jsou tam i znaky s výslovností. Velikost desítky kilobyte. Struktura html.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 864
  • Karma: 25
    • Verze Delphi: XE8, Seattle
Re:Nedaří se mi načíst data
« Odpověď #13 kdy: 17-09-2018, 12:47:01 »
Pokud jsou v utf8 je možné je načíst do stringlistu bez problémů (D2009+).
Údaje, které obsahují, se čtou a ukládají do DB nebo se s nimi dál nějak pracuje (mění se, nebo se jen čtou ve stejném formátu)?

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 197
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #14 kdy: 17-09-2018, 18:56:39 »
Pokud jsou v utf8 je možné je načíst do stringlistu bez problémů (D2009+).
Údaje, které obsahují, se čtou a ukládají do DB nebo se s nimi dál nějak pracuje (mění se, nebo se jen čtou ve stejném formátu)?

Jak jsem psal, chci jen zkrátit data, nic víc. Ale přijde mi zbytečné to parsovat což stringlist dělá.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: