open text file

Status
Niet open voor verdere reacties.

fcwiv

Gebruiker
Lid geworden
6 sep 2008
Berichten
43
Beste Allemaal.
ik sta voor een grote uitdaging, n.l:
momenteel ben ik bezig met een programma waarbij een stuk of 400 man het gaat gebruiken. Wat is het idee; ik wil graag een logfile maken (een txt bestand) waarin precies wordt aangegeven wanneer het persoon het bestand had geopend en gesloten.
Om dit te weergeven is geen probeleem:

open bestand as output etc
write # freefile, "OPEN" & Format(now(), "hhmmss")
Close # freefile

Maar hier zit het probleem eigenlijk.

Dit bestand , noem hem even log.txt, wordt tegelijkertijd geopend door 400 man.
Maar mijn ervarinig leert dat je een bestand niet meer dan 1 keer teglijkertijd kan openen want dan krijg je de foutmedling: Unable to open file. This file is already open.

mijn vraag aan jullie is hoe kan ik dit probleem omzeilen?

Een bestand (txt) ter beschikking stellen voor 400 man die tegelijk geopend wordt. Dit wil ik graag oplossen.

Weet iemand die?

Fred
 
Als het om de registratie gaat van 2 momentgegevens per gebruiker (de opening en sluiting van een bepaald bestand), dan lijkt mij het daarvoor open hebben staan van eenzelfde bestand bij 400 gebruikers niet echt een eenvoudige oplossing.
Ik zou ervoor kiezen per gebruiker slechts éénmaal gegevens weg te schrijven; op het moment dat de gebruiker het bestand beeindigt. Het tijdstip waarop het bestand is geopend dient dan tijdens de bewerkingstijd in het geheugen opgeslagen te worden.
Het aardige van Word is dat je van een bestand ook een exacte kopie kunt openen( in VBA; Documents.add "logbestand.doc") het 'tegelijk-open' probleem is daarmee ondervangen. Als je de loggegevens van de gebruiker aan dit bestand toevoegt met - activedocument.content insertafter "logtekst" - en opslaat met -Activedocument.saveas "logbestand.doc" - ben je klaar. De kans dat 2 personen op de milliseconde precies hun bestand afsluiten is uitermate klein. En dan geeeft de server wel een wachtmelding.
 
Laatst bewerkt:
Het is inderdaad noodzakelijk om sowieso te checken als het bestand waarna weggeschreven moet worden alreeds geopend is door 1 van al de andere gebruikers.

Stapsgewijs voor je code zou ik zeggen dat je dus:
1. Tijd in een variabele opslaan (en de gegevens die je wilt opslaan)

2. Controle functie of het logbestand al geopend is;'voorbeeldcode voor deze functie:
Code:
Function IsFileOpen(FileName As String) 
    Dim iFilenum As Long 
    Dim iErr As Long 
     
    On Error Resume Next 
    iFilenum = FreeFile() 
    Open FileName For Input Lock Read As #iFilenum 
    Close iFilenum 
    iErr = Err 
    On Error Goto 0 
     
    Select Case iErr 
    Case 0:    IsFileOpen = False 
    Case 70:   IsFileOpen = True 
    Case Else: Error iErr 
    End Select 
     
End Function
Indien het bestand geopend is; betekend dat een andere gebruiker iets aan het wegschrijven is; en zul je dus deze in een loop functie moeten hangen met een doevents en eventueel een wait-functie van enkele milliseconden.

3. Wegschrijven naar het logbestand - ik zou persoonlijk kiezen voor een simpel Textbestand (zijn kleiner en de verwerking hiervan is vele malen sneller dan bij word documenten; en de volgende code voor het wegschrijven:
Code:
Public Sub ReadHTMLFile(HTMLTop() As String, HTMLBottom() As String)
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.OpenTextFile([COLOR="Lime"][BESTANDSLOCATIE+NAAM.TXT][/COLOR])
            [COLOR="lime"]LOGTEXT[/COLOR]= a.readline
   a.Close
End Sub

succes!
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan