Autor Téma: Test na otevření souboru  (Přečteno 883 krát)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Test na otevření souboru
« kdy: 11-10-2020, 20:52:10 »
Ahoj pánové,
existuje funkce která vrátí hodnotu true pokud je soubor otevřený?
Nebo je to potřeba zkusit v bloku Try except (tak to dělám teď)? Nějak se mi to už vykouřilo z hlavy. Potřeboval bych zjistit, jestli soubor kam chci zapisovat po přijetí dat z comportu je otevřený nebo ne. Po každé dávce dat ho zavírám a někdy se stane, že při ukončování komunikace soubor zavřu někde v půlce a vyhodí to chybu. Předesílám, že přes vlákna to neumím.
Díky,
Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #1 kdy: 11-10-2020, 21:07:55 »
Teď si vzpomínám, myslím že IsOPen by to mohlo vrátit.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1150
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Test na otevření souboru
« Odpověď #2 kdy: 11-10-2020, 21:15:45 »
Nevím, co dělá IsOpen, ale na netu najdeš příklady, jak testovat pomocí CreateFile

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #3 kdy: 11-10-2020, 21:32:46 »
No, nedělá nic. S něčím jsem si to spletl. N anetu jsem našel toto, což funguje, ale stejně mi to moc nepomohlo.
Kód: Delphi [Vybrat]
  1. function IsFileInUse(fName: string) : boolean;
  2. var
  3.   HFileRes: HFILE;
  4. begin
  5.   Result := False;
  6.   if not FileExists(fName) then begin
  7.     Exit;
  8.   end;
  9.  
  10.   HFileRes := CreateFile(PChar(fName)
  11.     ,GENERIC_READ or GENERIC_WRITE
  12.     ,0
  13.     ,nil
  14.     ,OPEN_EXISTING
  15.     ,FILE_ATTRIBUTE_NORMAL
  16.     ,0);
  17.  
  18.   Result := (HFileRes = INVALID_HANDLE_VALUE);
  19.  
  20.   if not(Result) then begin
  21.     CloseHandle(HFileRes);
  22.   end;
  23. end;

Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1109
  • Karma: 47
    • Verze Delphi: 10.3
Re:Test na otevření souboru
« Odpověď #4 kdy: 11-10-2020, 21:39:27 »
Tak teoreticky se může stát, že soubor sice nemá nikdo otevřený, ale aplikace tam kvůli oprávnění stejně nebude moci zapisovat, takže mi přijde jednodušší ten zápis prostě zkusit. (Na Novellu šlo nastavit práva tak, že uživatel mohl soubor vytvořit, zapsat do něj, zavřít - a pak už ho ani on sám nemohl změnit nebo smazat.)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #5 kdy: 11-10-2020, 22:19:53 »
Abych vysvětlil, čeho chci dosáhnout.
na časovač třeba po vteřině spouštím v cyklech komunikaci s měřicí ústřednou přes comport. Data se zobrazují do stringgridu v otevřeném formuláři. Na konci každého cyklu po otevřu file, zapíšu data, zavřu file a čeká se na další událost časovače. Když chci ukončit měření, zavřu formulář s gridem a v události onClose zavřu i file s daty. Jenomže mezitím se to může potkat se startem zápisu dalšího cyklu a ten pak zapisuje do zavřeného fajlu. A je to - Error 103. Potřebuju aby program poznal, že fajl je zavřený a už do něj další data neposílal.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Test na otevření souboru
« Odpověď #6 kdy: 12-10-2020, 08:13:40 »

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #7 kdy: 12-10-2020, 09:43:00 »
Neběží, vlákna neumím.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1109
  • Karma: 47
    • Verze Delphi: 10.3
Re:Test na otevření souboru
« Odpověď #8 kdy: 12-10-2020, 09:44:18 »
Když to neběží ve vláknech, tak stačí si udělat nějaký příznak, že už nemá zapisovat?

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #9 kdy: 12-10-2020, 09:45:04 »
Jinak díky za tip, já mám D2009, ale třeba to bude stejné.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #10 kdy: 12-10-2020, 09:49:52 »
S příznakem to mám, většinou to projde dobře, teď experimentuju s tím, kde ho testovat. Jinak jsem objevil další svůj nedůsledný bordel, po zavřeni formuláře s gridem se pokouší procedura měřicího cyklu , která je v main unitě zapsat data do gridu, takže accsess violation.
Nic, musím na test covidu, uřesním až přijdu.
D.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Test na otevření souboru
« Odpověď #11 kdy: 12-10-2020, 12:57:22 »
Tak na rýchlo tu vidím dve riešenia:
  • Kontrolovať, či už procedúra meracieho cyklu ukončila svoju činnosť. Iba vtedy povoliť uzatvorenie. Medzitým môže byť formulár zobrazený a Disable
  • Procedúra meracieho cyklu bude kontrolovať if no Assigned(Grid) then. Tu samozrejme môže dôjsť k strate údajov
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Test na otevření souboru
« Odpověď #12 kdy: 12-10-2020, 15:04:35 »
Stačí se soubor pokusit otevřít výhradně (exclusive). Pokud se ti to podaří, můžeš zapisovat. Pokud ne, má jej otevřený někdo jiný.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #13 kdy: 12-10-2020, 15:53:53 »
Citace
Kontrolovať, či už procedúra meracieho cyklu ukončila svoju činnosť. Iba vtedy povoliť uzatvorenie. Medzitým môže byť formulár zobrazený a Disable
Procedúra meracieho cyklu bude kontrolovať if no Assigned(Grid) then. Tu samozrejme môže dôjsť k strate údajo

Spíš si myslím, že čistší by bylo umístit proceduru cyklu (obsluhu timeru) do stejné unit jako je ten formulář s gridem. Nebo se pletu (šeredně)?
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1150
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Test na otevření souboru
« Odpověď #14 kdy: 12-10-2020, 18:27:21 »
Otevřeš soubor s flagem fmShareExclusive a pak testuješ pomocí CreateFile.
To musí fungovat.