Oppure

Loading
24/03/22 8:00
actarus999
Ciao a tutti, ho bisogno di scrivere su un file dentro una cartella del mio account su Google Drive.
Per fare ciò ho scritto un'applicazione desktop in VB.net mediante le Google Driver API v3.
Dal momento che sia io che il mio amico entriamo nello stesso account da differenti PC e modifichiamo il file mediante il software che ho creato in VB.net mi chiedevo se esiste un metodo per verificare se il file è aperto da un altro utente prima di aprirlo cosicché evito di farlo aprire e creo una sorta di apertura esclusiva al file.

Non so se esiste già questa possibilità nelle opzioni di Google Drive senza passare dalle api (cioè abilitarla con un semplice click nelle impostazioni di google).

Potrei provare a settare i permessi al file "di sola lettura" una volta aperto dalla mia applicazione ma credo che non sia una buona idea perché se per esempio va via la luce o il software va in crash per altri motivi, il file rimarrà per sempre di sola lettura.

Ecco la procedura che ho creato per:
connettermi al mio Google Drive con le mie credenziali
ricerca della mia cartella e lettura del suo ID
ricerca del mio file e lettura del suo ID

Public Sub GoogleDrive()
Dim credential As UserCredential
Dim ID_Folder As String = ""
Dim ID_File As String = ""

Using Stream = New FileStream("credenzials.json", FileMode.Open, FileAccess.Read)
'The file token.json stores the user's access and refresh tokens, and is created
'automatically when the authorization flow completes for the first time.
Dim credPath As String = "token.json"
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(Stream).Secrets,
Scopes,
"user",
CancellationToken.None,
New FileDataStore(credPath, True)).Result
Console.WriteLine("Credential file saved to: " + credPath)

End Using
'Create Drive API service.
Dim Service = New DriveService(New BaseClientService.Initializer() With
{
.HttpClientInitializer = credential,
.ApplicationName = ApplicationName
})
' Define parameters of request.
Try
Dim findrequest As FilesResource.ListRequest = Service.Files.List()
findrequest.PageSize = 10
findrequest.Fields = "nextPageToken, files(id, name)"
findrequest.Spaces = "drive"
Dim listFolder As Data.FileList = findrequest.Execute()

If listFolder.Files.Count > 0 Then
For Each item In listFolder.Files
If item.MimeType = "application/vnd.google-apps.folder" Then
If item.Name = "MyFolder" Then
ID_Folder = item.Id.ToString
End If
End If
'
If item.MimeType = "application/msaccess" Then
If item.Name = "myFile.mdb" Then
ID_File = item.Id.ToString
End If
End If

If (ID_File <> "";) And (ID_Folder <> "";) Then
'Si può verificare se aperto da altro utente ?
Exit For
End If
Next
End If

Catch ex As Exception
'MsgBox(ex.Message)
Throw ex

End Try
End Sub

Qualcuno mi può aiutare ?
Grazie in anticipo
24/03/22 14:43
Carlo
Potresti usare la tecnica di Office che quando apre un file, ne crea un'altro con le info di chi ha aperto e quando. Il file viene cancellato alla chiusura.
Es. se il nome del file doc è: Documento.doc, il file di controllo si chiama: ~$Documento.doc
Chi accede, prima controlla l'esistenza del file di controllo ne legge il contenuto e segnala chi sta usando il file vero, due righe di codice.
Anche questa tecnica fallisce se va via la corrente, infatti il file di controllo non verrà aggiornato e o cancellato, bisogna introdurre una scadenza o un'opzione per eliminare il file di controllo quando serve. Naturalmente se l'utente che accede trova il file di controllo, e dentro c'è scritto che è lui che sta usando il file, significa che c'è stata un'anomalia e si può intervenire da codice.

Se esistono procedure già preordinate non lo so.
in programmazione tutto è permesso
24/03/22 17:00
actarus999
Grazie Carlo, avevo pensato ad una soluzione del genere, ma non mi piace, poco professionale e senza controllo vero sul file. Se va via la luce o va in crash non cancella il file di controllo.
26/03/22 0:21
Carlo
Mi dispiace non poterti aiutare di più.
Poco proffessionale? E' usato da Microsoft e non solo, infatti quasi tutti i programmi di montaggio video quando si apre un progetto creano nomerosi file che permettono il recupero del progetto in caso di anomalie, evitano l'apertura multipla e monitorano il funzionamento del programma (log).

Se invece di scrivere il file di controllo all'apertura e cancellarlo alla chisura, salvi un log d'uso?
Quando con il tuo programma accedi al file scrivi in un altro file: file yyyyyyyy.xxx aperto da: Caio, data: gg/mm/aaaa ore: hh:mm:ss
poi con un timer riscrivi ogni tot il file di controllo con l'orario aggiornato.
Ora sei in grado di sapere se il file condiviso viene usato veramente, basta che l'ora nel file di controllo non differisca più di un tot dall'ora attuale.
Ultima modifica effettuata da Carlo 26/03/22 0:22
in programmazione tutto è permesso