IALweb Homepage
Forum Home Forum Home > MS Office > Microsoft Office > Microsoft Access
  New Posts New Posts RSS Feed - [RISOLTO]Dimensione file del link su txtbox
  FAQ FAQ  Forum Search   Events   Register Register  Login Login


REGISTRATEVI su IALWeb forum!

[RISOLTO]Dimensione file del link su txtbox

 Post Reply Post Reply Page  <12
Author
Message
@Alex View Drop Down
Utente Onorario
Utente Onorario
Avatar

Joined: 09/Apr/2012
Location: Mantova
Status: Offline
Points: 4978
Post Options Post Options   Thanks (0) Thanks(0)   Quote @Alex Quote  Post ReplyReply Direct Link To This Post Posted: 01/Gen/2018 at 18:19
L'uso di FSO in quel modo, è estremamente disfunzionale... pur condividendo con le considerazioni di Willy.

Il probelma di quel sistema di usare FSO, è che va benissimo se si utilizza ONE-SHOT, vale a dire si fa una singola interrogazione... in quel caso l'istanza del Server di Automazione di FSO è sostanzialmente irrilevante.
Nel caso in cui questa funzione debba essere richiamata in una Query invece reputo estremamente sconveniente in termini prestazionali continuare ad Istanziare e distruggere un Server COM.
In ogni caso quella Funzione ha di suo qualche mancanza... come la mancata dichiarazione delle Variabili...!

Questo era quanto avevo già accennato sopra nelle mie considerazioni.
Modificherei la funzione di FSO in questo modo, creando un Modulo Generico:
Private FileObject As Object

Function FileSizeFSO(nomefile As String) As String
    Dim dblSize    As Double
    If FileObject Is Nothing Then
         Set FileObject = CreateObject("Scripting.FileSystemObject")
    End If
    dblSize = FileObject.GetFile(nomefile).Size

    If dblSize >= 1073741824 Then
        FileSizeFSO = Format(dblSize / 1024 / 1024 / 1024, "#0.00") & " GB"
    ElseIf dblSize >= 1048576 Then
        FileSizeFSO = Format(dblSize / 1024 / 1024, "#0.00") & " MB"
    ElseIf dblSize >= 1024 Then
        FileSizeFSO = Format(dblSize / 1024, "#0.00") & " KB"
    ElseIf dblSize < 1024 Then
        FileSizeFSO = Fix(dblSize) & " Bytes"
    End If
End Function


Il vantaggio in questo caso è che l'istanza viene aperta alla prima esecuzione della Query, ma solamente al PRIMO RECORD, in tutti i records successivi viene riutilizzata l'istanza del Server COM di FSO già esistente, rendendo il tutto veloce... più veloce.


Edited by @Alex - 01/Gen/2018 at 18:25
Non SUPPORTO il CROSSPOST.
Mio Sito
Scaricare i DEMO modificando l'Estensione.
Back to Top
Sponsored Links


Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 9523
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 01/Gen/2018 at 19:10

Originally posted by surfgarden surfgarden wrote:

Forse la soluzione migliore sarebbe l'inserimento  della dimensione del file  in un campo della tabella PERCORSI contestualmente all'inserimento del percorso stesso, ma non sono in grado di aggiungere quanto occorre al codice:


Private Sub cmdSfoglia_Click()

   Dim fDialog As Office.FileDialog
   Dim varFile As Variant
   Dim Filters As String
   Dim FileName As String
  
   Me.FileList.RowSource = ""
   Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
   With fDialog
         .AllowMultiSelect = False
      .Title = "Seleziona percorso file del Film:"
      .Filters.Clear
       Filters.Add "Mkv", "*.MKV"
      .Filters.Add "DivX, Xvid,", "*.AVI"
      .Filters.Add "Tutti i file", "*.*"
 
      If .Show = True Then
        For Each varFile In .SelectedItems
            Me.FileList.AddItem varFile
        Next

       Else
         MsgBox "Hai cliccato Cancella nella finestra di dialogo"
      End If
   End With
End Sub

Se potete aiutarmi in quest'ultimo intento.. on line non sono riuscito a trovare niente in merito.

In merito al caricamento del dato sulla dimensione del file, all'atto della scelta tramite FileDialog(msoFileDialogFolderPicker) valuta il metodo Folder.GetDetailsOf.
https://technet.microsoft.com/en-us/library/ee176615.aspx
Con l'occasione puoi vedere, sull'argomento i seguenti link di esempio:
http://www.vbaexpress.com/kb/getarticle.php?kb_id=405
http://www.utteraccess.com/forum/lofiversion/index.php/t2032956.html
https://windowssecrets.com/forums/showthread.php/157834-VBA-FileSystemObject-Properties-Dimensions-Size-and-Vertical-resolution
https://www.exceltip.com/files-workbook-and-worksheets-in-vba/list-files-in-a-folder-with-microsoft-scripting-runtime-using-vba-in-microsoft-excel.html
https://www.mrexcel.com/forum/excel-questions/691057-macro-list-sub-folders-files.html
https://www.access-programmers.co.uk/forums/showthread.php?t=108867
https://www.ozgrid.com/forum/forum/help-forums/excel-general/141004-macro-that-extract-video-filename-size-and-duration-and-list-to-excel
https://forums.techguy.org/threads/getting-file-properties-with-objfolder-getdetailsof-objfolderitem-156.1037229/
http://www.tek-tips.com/viewthread.cfm?qid=1707647


 



Edited by willy55 - 01/Gen/2018 at 19:11
Willy
Back to Top
surfgarden View Drop Down
Utente Base
Utente Base


Joined: 08/Dic/2016
Location: Vicenza
Status: Offline
Points: 85
Post Options Post Options   Thanks (0) Thanks(0)   Quote surfgarden Quote  Post ReplyReply Direct Link To This Post Posted: 02/Gen/2018 at 00:52
Originally posted by @Alex @Alex wrote:

L'uso di FSO in quel modo, è estremamente disfunzionale... pur condividendo con le considerazioni di Willy.

Il probelma di quel sistema di usare FSO, è che va benissimo se si utilizza ONE-SHOT, vale a dire si fa una singola interrogazione... in quel caso l'istanza del Server di Automazione di FSO è sostanzialmente irrilevante.
Nel caso in cui questa funzione debba essere richiamata in una Query invece reputo estremamente sconveniente in termini prestazionali continuare ad Istanziare e distruggere un Server COM.
In ogni caso quella Funzione ha di suo qualche mancanza... come la mancata dichiarazione delle Variabili...!

Questo era quanto avevo già accennato sopra nelle mie considerazioni.
Modificherei la funzione di FSO in questo modo, creando un Modulo Generico:
Private FileObject As Object

Function FileSizeFSO(nomefile As String) As String
    Dim dblSize    As Double
    If FileObject Is Nothing Then
         Set FileObject = CreateObject("Scripting.FileSystemObject")
    End If
    dblSize = FileObject.GetFile(nomefile).Size

    If dblSize >= 1073741824 Then
        FileSizeFSO = Format(dblSize / 1024 / 1024 / 1024, "#0.00") & " GB"
    ElseIf dblSize >= 1048576 Then
        FileSizeFSO = Format(dblSize / 1024 / 1024, "#0.00") & " MB"
    ElseIf dblSize >= 1024 Then
        FileSizeFSO = Format(dblSize / 1024, "#0.00") & " KB"
    ElseIf dblSize < 1024 Then
        FileSizeFSO = Fix(dblSize) & " Bytes"
    End If
End Function


Il vantaggio in questo caso è che l'istanza viene aperta alla prima esecuzione della Query, ma solamente al PRIMO RECORD, in tutti i records successivi viene riutilizzata l'istanza del Server COM di FSO già esistente, rendendo il tutto veloce... più veloce.

IMPECCABILE !!! ...e istantaneo! Thumbs Up
..esattamente quello che cercavo!
Clap  Grazie infinite!
Back to Top
surfgarden View Drop Down
Utente Base
Utente Base


Joined: 08/Dic/2016
Location: Vicenza
Status: Offline
Points: 85
Post Options Post Options   Thanks (0) Thanks(0)   Quote surfgarden Quote  Post ReplyReply Direct Link To This Post Posted: 02/Gen/2018 at 01:22
Originally posted by willy55 willy55 wrote:

Effettivamente la funzione ULongToCurrency permette di risolvere le dimensioni con file nell'intervallo compreso fra 2 e 4 GB, in quanto la funzione FileLen (utilizza un Long, e quindi 32 bit di cui uno per il segno) restituisce un valore negativo, il quale aggiunto alla base di partenza (quale limite ai 2 ^ 31 bit  = 2147483648 dei bit senza segno) permette di ottenere la corretta size del file.
Infatti se si prende un file di 3,94 GB (4.238.475.264 byte) la funzione FileLen restituisce -56492032 che trattato con la funzione  ULongToCurrency effettua la corretta conversione nel valore 4238475264
Il limite all'impiego della funzione FileLen e quindi anche a ULongToCurrency è che proprio la prima, agendo su un tipo Long, rappresenta un massimo di 2 ^ 32 bit quindi il valore fra 0 e 4294967295 (come massimo).

Sfortunatamente se si prendono dei file che superano i 4 GB non è possibile sfruttare le funzioni sopra-citate.
Infatti se si prende un file di 8,38 GB (9.001.203.689 byte) la funzione FileLen restituisce il valore 411269097 che seppure trattato dalla ULongToCurrency non da il valore corretto.
Allo stesso modo un file di 6,58 GB (7.076.188.160 byte) restituisce -1513746432 (come FileLen) che trattato, diventa: 2781220864, del tutto errato, in quanto dovrebbe essere legato al numero di bit in base al gruppo di 2 GB in cui ricade aumentando la base a cui far riferimento.
Se volessimo visualizzare l'andamento dei valori restituiti dalla FileLen, negli intervalli li potremmo rappresentare in:

GB:           0        2        4        6        8        10        12 GB
valori:        positivi negativi positivi negativi positivi  negativi
intervallo:          primo            secondo             terzo
 

Ne consegue che la funzione FileLen (operando in Long su 32 bit) restituisce un intervallo (fra positivi e negativi) al massimo di 4 GB e sarebbe necessario di ulteriori bit per individuare su quale intervallo stia operando.
Avendo tale informazione sarebbe possibile stabilire una funzione di calcolo con:

   valore forninto da FileLen + 2 ^ ( 31 + intervallo)
 
Pertanto riprendendo l'esempio precedente ove si abbia un file con lunghezza del file di 7076188160  la funzione FileLen restituisce un valore negativo come -1513746432 che ricade nel secondo intervallo per cui i valori corretti verrebbero pari a:

-1513746432 + 2 ^ (31 + 2)  = -1513746432 + 2 ^ 33 = -1513746432 + 8589934592 = 7076188160
corrisondenti a:
' 6,59021377563477 GB
' 6748,37890625     MB
' 6910340             KB
' 7076188160       byte


Ora non essendo disponibile tale opportunità vi è necessità di impiegare sistemi alternativi che dovranno essere valutati in base ai vincoli e limiti del progetto e ambiente impiegato.

Una strada può essere l'impiego delle API.

....

Altra soluzione è l'impiego dell'oggetto FSO (File System Object) con il quale è possibile avere informazioni o manipolare i file nelle applicazioni di Scripting.

.....

Concludendo, qualora si abbia necessità di gestire file con dimensioni superiori a 4 GB solo le due ultime funzioni sono in grado di assicurare la corretta size dei file.
Dal momento che le API sono strettamente legate al sistema operativo (con vincoli sui 32 o 64 bit) consiglio di valutare gli effettivi tempi e,  se accettabili, optare per l'ultima funzione (che impiega l'oggetto FSO) che vede il sistema operativo proprio come oggetto e, quindi, seppure più lento rispetto alle API, assicura una maggiore versatilità nell’ambiente impiegato.

Grazie infinite per la pazienza con cui mi hai fornito la tua spiegazione dettagliata ed esaustiva.

Nel PC di casa, ambiente in cui utilizzo il db e che fisicamente "vede" tutti gli HDD connessi , il codice di Alex svolge impeccabilmente la sua funzione, tenendomi peraltro sempre aggiornato la dimensione dei file (che spesso sostituisco, pur mantenendone il nome) nei percorsi delle varie dir.

L'alternativa dell'inserimento in tabella piuttosto che in Queries mi permette tuttavia di progettare modifiche "calcolate" nelle directory, e quindi mi è utile al lavoro quando intervengo col notebook via cloud.

Vero che potrei sempre creare una tabella direttamente dalla query...ma sull'inserimento da fDialog ci ho sbattuto così tanto la testa senza riuscirci che non mi farò scappare l'occasione di riprovarci consultando i tuoi link.

Grazie di nuovo 

Back to Top
willy55 View Drop Down
Moderatore
Moderatore
Avatar
Esperto di Access

Joined: 03/Ago/2011
Location: Italy
Status: Offline
Points: 9523
Post Options Post Options   Thanks (0) Thanks(0)   Quote willy55 Quote  Post ReplyReply Direct Link To This Post Posted: 02/Gen/2018 at 19:36

Originally posted by surfgarden surfgarden wrote:


Vero che potrei sempre creare una tabella direttamente dalla query...ma sull'inserimento da fDialog ci ho sbattuto così tanto la testa senza riuscirci che non mi farò scappare l'occasione di riprovarci consultando i tuoi link

Non sbattere troppo la testa ... Ouch  se vedi uno dei link che ti ho indicato, ove trovi il codice sottoriportato (che ho semplicemente adattato) potrai superare l'impasse, ed avere una visione sul dettaglio dei dati (associati al file selezionato tramite FileDialog).
 


' ------------------------------------------------------------------------------------
' Visualizza cartelle e file presenti nel disco, filtrandone alcuni tipi,
' ove l'utente può selezionare un file e prendere visione dei dati associati:
' Nome, Dimensione del file, Tipo, Data ultima modifica, Data creazione,
' Data ultimo accesso, Attributi, Stato, Proprietario, Autore, Titolo,
' Oggetto, Categoria, Pagine, Commenti, Copyright, Artista, Titolo album,
' Anno, Numero brano, Genere, Durata, Velocità in bit, Protetto,
' Modello fotocamera, Data immagine scattata, Formato, Titolo puntata,
' Descrizione programma, Dimensioni campione audio, Velocità campione audio, Canali
'
' Tratto da:
' https://www.access-programmers.co.uk/forums/showthread.php?t=108867
' Uso:
'     Call FolderFileDetails
' Si ricorda che l'impiego dell'oggetto FileDialog necessita sia instanziata,
' nei riferimenti, la libreria Microsoft Office XX.X Object Library
' (ove XX.X saranno legati alla versione di MS-Access impiegata)
' ------------------------------------------------------------------------------------

Public Sub FolderFileDetails()
Dim path As String
Dim TBfile As String
Dim fullpath As String
Dim FD As FileDialog
Dim name As String
Dim loc As String
Dim obj As Object
Dim getit
Dim f As Object
Dim i
Dim strDetail As String
 
Set FD = Application.FileDialog(msoFileDialogFilePicker)
Dim vrtSelectedItem As Variant
With FD
    .AllowMultiSelect = False
    .Filters.Add "PDF", "*.pdf", 1
    .Filters.Add "Word", "*.doc", 1
    .Filters.Add "Excel", "*.xls", 1
    .Filters.Add "Any", "*.*", 1
    .ButtonName = "Get Some!"
    .Title = "Find File"
        
    If .Show = -1 Then
        For Each vrtSelectedItem In .SelectedItems
            name = Dir(vrtSelectedItem, vbSystem)
            Dim fso As Object

            Set fso = CreateObject("Scripting.FileSystemObject")
            Set f = fso.GetFile(name)

            'create scripting object to check for existence and manage file path and name
            Set fso = CreateObject("Scripting.FileSystemObject")
            'check that filespec exists
            If fso.FileExists(f.path) Then
                'if so, create shell app
                Set obj = CreateObject("Shell.Application")
                'reference namespace method of shell application
                With obj.Namespace(fso.GetParentFolderName(f.path))
                    'return extended file property 9 of file indexed by name
                    For i = 0 To 34
                        getit = .GetDetailsOf(.Items, i) & ":" & .GetDetailsOf(.Items.Item(fso.GetFileName(f.path)), i)
                        ' Debug.Print getit ' Me.List2.AddItem Item:=getit
                        strDetail = strDetail & getit & vbCrLf 'Concatena i vari elementi nella stringa per successiva presentazione
                    Next
                    MsgBox prompt:=strDetail, Buttons:=vbInformation, Title:="Valori di dettaglio:"
                End With
            Else
                'file does not exist, so raise custom error
                Err.Raise 40001, "GetFileAuthor()", "File '" & f.path & "' not found"
            End If
     
        Next vrtSelectedItem
     
    Else
    End If
End With
   
Set FD = Nothing
Set f = Nothing
Set fso = Nothing
   
End Sub

 

Willy
Back to Top
surfgarden View Drop Down
Utente Base
Utente Base


Joined: 08/Dic/2016
Location: Vicenza
Status: Offline
Points: 85
Post Options Post Options   Thanks (0) Thanks(0)   Quote surfgarden Quote  Post ReplyReply Direct Link To This Post Posted: 03/Gen/2018 at 01:24
Originally posted by willy55 willy55 wrote:

Non sbattere troppo la testa ... Ouch  se vedi uno dei link che ti ho indicato, ove trovi il codice sottoriportato (che ho semplicemente adattato) potrai superare l'impasse, ed avere una visione sul dettaglio dei dati (associati al file selezionato tramite FileDialog).

(POST PROVVISORIO

Stamattina al lavoro me li sono guardati tutti i tuoi link, e proprio sul codice del post 12 avevo  iniziato a testare, aprendomi una casella di riepilogo nominata List2 e buttom per lanciare la routine. Ricordo che l'esecuzione del codice si arrestava al Me.List2.AddItem Item:=getit  e non capivo come adattarlo. Poi non ho più avuto tempo.

..e neanche ora ho la possibilità di testare il tuo. Domani riprendo, ma già noto che hai segnato il debug proprio sullo stesso punto.

Intanto volevo ringraziarti...)

EDIT: PERFETTO !! Thumbs Up

Associato al buttom di ieri, mi è bastato dichiarare la variabile strDetail as string, e... VOILA' ! Big smile

..come avevi intuito.. avrei sbattuto la testa giorni e giorni senza mai immaginare che bastasse concatenare in stringa il getit Embarrassed

ora potrò scegliere quali delle 34 proprietà del file mi potranno interessare, ed inserirle in nuovi relativi campi della tab PERCORSI! 

Di nuovo... grazie mille ad entrambi!! Hug  



Edited by surfgarden - 03/Gen/2018 at 10:14
Back to Top
 Post Reply Post Reply Page  <12
  Share Topic   

Forum Jump Forum Permissions View Drop Down

Forum Software by Web Wiz Forums® version 10.17
Copyright ©2001-2013 Web Wiz Ltd.

This page was generated in 0,063 seconds.