Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [VB6] file testo condiviso su vari pc

    Buonasera, ho un piccolo problema con un programma in vb6.


    Ho alcuni pc che fanno girare lo stesso programma vb. Questi programmi eseguono delle operazioni e poi incrementano il valore di un contatore salvato su un file txt condiviso all'interno di un nas esterno.


    Il problema che mi si presenta é che in qualche raro caso, due pc, aprono, incrementano e salvano il file di testo in precisa contemporanea. Questo mi fa sfalsare il contatore all'interno del file.

    Ho pensato che quando i due programmi eseguono in contemporanea, entrambi aprono il txt, per esempio con il numero 532, entrambi sommano 1 e poi salvano entrambi 533, al posto di trovarmi 534.

    Come posso ovviare al problema?

    grazie
    PIERCHI

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Mi pare che non hai molte alternative, devi aprire il file con accesso esclusivo.
    Ovviamente devi intercettare l'errore di apertura fallita quando il file è in uso.

  3. #3
    grazie per l'idea.

    Mi sono messo alla ricerca di qualche info a riguardo.

    Ho trovato questo
    codice:
    '--------------------------------------------------
    ' Long Function [FileIsOpen]
    ' Verifica se il file è aperto da un altro utente
    ' 0 = file non aperto
    ' 1 = file aperto
    ' 100 = errore non previsto
    '--------------------------------------------------
    Private Function FileIsOpen(fileToOpen) As Long
    Dim f As Integer
    f = FreeFile
    On Error GoTo ERROR_OPEN
    Open fileToOpen For Binary Access Read Lock Read As #f
    Close #f
    FileIsOpen = 0 ' file non aperto
    Exit Function
    ERROR_OPEN:
    If Err = 70 Then ' file già aperto
    FileIsOpen = 1
    Err.Clear
    ElseIf Err <> 0 Then
    FileIsOpen = 100 ' altro tipo d'errore
    End If
    End Function

    Però ho provato ad aprire un file (tramite un command button), a chiamare questa funzione, e poi a chiudere il file.

    Ricevo sempre 100. Ricevo quindi sempre un "altro tipo di errore"...

    Sbaglio qualcosa?
    Ultima modifica di pierchi; 21-02-2016 a 23:59
    PIERCHI

  4. #4
    Ho risolto usando questo

    questo mi risponde vero o falso se è aperto o no.

    grazie

    codice:
    Private Const GENERIC_READ As Long = &H80000000Private Const INVALID_HANDLE_VALUE As Long = -1
    Private Const OPEN_EXISTING As Long = 3
    Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80 
    
    
    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hFile As Long) As Long
    
    
    Private Function isFileInUSe(ByVal miofile As String) As Boolean
    Dim hFile As Long
      hFile = CreateFile(miofile, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
      isFileInUSe = hFile = INVALID_HANDLE_VALUE
      CloseHandle(hFile)
    End Function
    PIERCHI

  5. #5
    Anche effettuando le modifiche proposte ieri, il problema persiste. Mi trovo ancora dei numeri in contemporanea nel file


    idee?


    codice:
    If isFileInUSe("\\192.168.1.6\public\Contatore.INI") = "false" Then
    incrementare = ReadINI("CONTATORE", "Esecuzioni", "\\192.168.1.6\public\Contatore.INI")
    Call WriteINI("CONTATORE", "Esecuzioni", incrementare + 1, "\\192.168.1.6\public\Contatore.INI")
    l_Titolo.caption= "Contatore icrementato a: " & incrementare + 1
    Else
    l_Titolo.caption= "Contatore non incrementato!"
    End If
    Ultima modifica di pierchi; 22-02-2016 a 14:04
    PIERCHI

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Scusa, ma perché hai aperto il file così?
    codice:
    Open fileToOpen For Binary Access Read Lock Read As #f



    Hai fatto esattamente il contrario, cioè devi aprirlo in lettura/scrittura e bloccarlo in lettura/scrittura per gli altri processi, ovvero:
    codice:
    Open fileToOpen For Binary Access Read Write Lock Read Write As #f

    Fai un progettino di prova in cui:
    1.metti una variabile a livello di modulo:
    Dim m_ff as Integer
    2. e la usi per aprire il file AS #m_ff come ti ho indicato (ma senza chiuderlo)
    3. ora apriro con la tua funzione FileIsOpen, e vedrai che ti restituirà picche...
    4. chiudi il file #m_ff
    5. ritenta usando FileIsOpen ed il file ora si apre.


  7. #7
    Quote Originariamente inviata da gibra Visualizza il messaggio
    Scusa, ma perché hai aperto il file così?
    codice:
    Open fileToOpen For Binary Access Read Lock Read As #f



    Hai fatto esattamente il contrario, cioè devi aprirlo in lettura/scrittura e bloccarlo in lettura/scrittura per gli altri processi, ovvero:
    codice:
    Open fileToOpen For Binary Access Read Write Lock Read Write As #f

    Fai un progettino di prova in cui:
    1.metti una variabile a livello di modulo:
    Dim m_ff as Integer
    2. e la usi per aprire il file AS #m_ff come ti ho indicato (ma senza chiuderlo)
    3. ora apriro con la tua funzione FileIsOpen, e vedrai che ti restituirà picche...
    4. chiudi il file #m_ff
    5. ritenta usando FileIsOpen ed il file ora si apre.

    Ciao, il codice sopra scritto era copiato da un articolo online.

    L'avevo preso per studiarmelo e non trovavo il problema che mi hai indicato tu.

    Appena ho tempo riprovo!

    Una domanda, è possibile poi portare il sistema, utilizzando le API per scrivere i file INI? perchè effettivamente quando ho parlato di file di testo, intendevo file INI.
    PIERCHI

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Cosa intendi per 'portare il sistema' ...?

    Se, come penso, intendi dire 'gestire' i file INI allora certamente.
    Sul mio sito, trovi un progetto completo che tra le tantissime cose, vi trovi anche una classe per la gestione dei file INI

    Login Project v.4.0
    http://nuke.vbcorner.net/Projects/VB...S/Default.aspx

  9. #9
    Con la tua modifica adesso anche quel codice funziona. Infatti avendo fatto una prova come mi hai consigliato, il controllo mi restituisce 0 quando è libero e 1 quando è occupato il file.

    Ora io utilizzo già un mio codice per effettuare dei salvataggi su dei file ini:


    codice:
    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As LongPrivate Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
    
    
    
    Public Function WriteINI(strSection As String, strKeyName As String, strText As String, strFileName As String, Optional iniDirPathName As String)    Dim intLen As Integer
        Dim strIniFile As String
        If Right$(iniDirPathName, 1) = "\" Then
            Mid$(iniDirPathName, Len(iniDirPathName), 1) = Space$(1)
            iniDirPathName = RTrim$(iniDirPathName)
        End If
         strIniFile = strFileName
         intLen = WritePrivateProfileString(strSection, strKeyName, strText, strIniFile)

    Chiedevo se potevo adattare qui dentro, il controllo del file occupato.

    E' questo che mi scrive sui file!

    Ciao
    PIERCHI

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    No, le funzioni per i file INI non gestiscono queste cose.

    Scusa, ma non potevi dirlo prima?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.