Results 1 to 3 of 3

Thread: Hoe te controleren of csv-bestand in gebruik is c.q. aangemaakt wordt ?

  1. #1
    TDigitalTrain user Hans Brenkman's Avatar
    Join Date
    Mar 2002
    Location
    Weert
    Posts
    1,861

    Hoe te controleren of csv-bestand in gebruik is c.q. aangemaakt wordt ?

    Hi,

    Ik heb een service-applicatie die om de zoveel tijd een csv-bestand moet inlezen. Het bestand wordt ieder heel uur overschreven door een externe partij en middels een share kan de service-applicatie het bestand benaderen. Het inlezen van die csv gebeurd in 1 seconde, maar de service-applicatie dient het inlezen van het bestand uit te stellen op het moment dat het bestand aangemaakt wordt. Dat aanmaken duurt zo'n 5 minuten.

    Ik heb geen schrijfrechten op die share, dus ik kan het bestand alleen in read-mode openen bijv. met

    Code:
      function MyFileSize(AFileName: string): integer;
      var
        hFile: THandle;
        hSize: DWORD;
      begin
        Result := 0;
    
        hFile := CreateFile( PChar(AFilename)
                           , GENERIC_READ
                           , FILE_SHARE_READ
                           , nil
                           , OPEN_EXISTING
                           , FILE_ATTRIBUTE_NORMAL
                           , 0 );
        if hFile <> INVALID_HANDLE_VALUE then
          Result := GetFileSize(hFile, @hSize);
      end;
    Wanneer de task in de service-applicatie uitgevoerd moet worden, controleer ik op de grootte van het csv-bestand en een minuut later weer. Als de grootte onveranderd is, dan ga ik er vanuit dat er niet geschreven wordt en de applicatie het bestand kan inlezen.

    Echter, als ik de grootte opvraag, krijg ik ook tijdens het aanmaken van het bestand als result de originele grootte, terwijl ik m.b.v. de verkenner zie dat de grootte vanaf 0 oploopt tot de oorspronkelijke grootte. Met welke functie kan ik de daadwerkelijke grootte achterhalen zoals de verkenner dat doet ? Of hoe zou ik dit anders op kunnen lossen ?
    Testen kan niet de afwezigheid van fouten aantonen, slechts de aanwezigheid van gevonden fouten.

    Het is verdacht als een nieuw ontwikkeld programma direct lijkt te werken: waarschijnlijk neutraliseren twee ontwerpfouten elkaar.

  2. #2
    Quote Originally Posted by Hans Brenkman View Post
    Ik heb een service-applicatie die om de zoveel tijd een csv-bestand moet inlezen.
    It is a dangerous path to take.
    There are only two ways to safely share a file:

    - The creator should produce a unique file name each time and keep the file exclusively locked for the whole creation duration. This require that network based file locking actually works.... which it may or may not depending on which version of the SMB protocol is used. On Windows this usually works reasonably with Win 7 and up. And with newer Linux distributions using Samba, it mostly also works. There can be issues if its on file shares using DFS (distributed file system) and such which are beasts of their own.

    - The creator should produce a unique file with a temporary extension. Only when the file is completely done and ready for delivery, the file should be renamed to the .csv extension. The reader will ONLY look for files with .csv extension and thus it will allways be safe for the reader to read the file without interfering with any potential writer.

    The later way is the safest way and the one I absolutely prefer to use when sharing "live" files on file shares between two entities.
    The best solution is to use an application server to generate and deliver the file data on request. But that is not what you are asking about.

  3. #3
    TDigitalTrain user Hans Brenkman's Avatar
    Join Date
    Mar 2002
    Location
    Weert
    Posts
    1,861

    Thumbs up

    Bedankt voor je heldere antwoord.

    Ik had i.d.d. bemerkt dat het bestand tijdens creatie niet gelocked was, anders was dat wellicht ook een mogelijkheid geweest.

    De 2e optie lijkt me ook de beste, maar de vraag is of de externe partij dit zo kan en wil aanpassen.

    Alternatief is de task (die random start als de service wordt gestart om niet alle tasks binnen de service te gelijk te starten) alleen uit te laten voeren als de tijd tussen bijv. xx:20:00 en xx:50:00 is. Elk heel uur (xx:00:00) wordt het bestand aangemaakt en groeit nagenoeg niet, het aantal regels is vast, alleen de data in de regels kunnen wijzigen. Dit is ook geen 100% goede optie, maar veiliger dan geen controle.
    Testen kan niet de afwezigheid van fouten aantonen, slechts de aanwezigheid van gevonden fouten.

    Het is verdacht als een nieuw ontwikkeld programma direct lijkt te werken: waarschijnlijk neutraliseren twee ontwerpfouten elkaar.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •