Risolto attributo file.txt creati con fso.

ezio68

Utente abituale
Original poster
12 Marzo 2023
763
33
28
58
Siracusa
2021
buongiorno, potreste indicarmi gentilmente come posso mettere (per esempio) un attributo di sola lettura in un file creato Fso ?
ecco il codice :
Visual Basic:
Private Sub CommandButton13_Click()

    Dim FSO As Object
    Dim NewFile As Object
    Dim I As Long
    Dim j As Long
   
   
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set NewFile = FSO.CreateTextFile("C:\Users\SLDGNZ68E23I754F\Desktop\SCANSIONI NOTIFICHE PER GEDO\NUOVO.TXT", True)
   
    For I = 1 To 20
        NewFile.WriteBlankLines (3)
        NewFile.WriteLine Cells(I, 1)
        NewFile.WriteLine "-----"
    Next I
   
    For j = 1 To 20
        NewFile.WriteLine Cells(j, 1)
    Next j
   
    NewFile.Attributes = 1
 
End Sub
non fate caso al doppio ciclo for. stavo facendo alcune prove su metodi e proprietà.
in questo link non mi è chiara la spiegazione : https://learn.microsoft.com/en-us/o...rence/user-interface-help/attributes-property
quindi ho provato come nel codice che ho postato però mi restituisce errore 438 (metodo propr. non sopportati dall'oggetto). grazie . . .
 

alfrimpa

VBA Expert
Supermoderatore
18 Dicembre 2015
78.942
8.665
2.445
72
Napoli
Office 365
Prova a cambiare la riga 22 così

NewFile.Attributes = NewFile.Attributes Or ReadOnlyAttr
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
980
465
95
thetruster.altervista.org
LTSC 2024
NewFile.Attributes = NewFile.Attributes Or ReadOnlyAttr

Ciao Alfredo,
A quanto vedo sta utilizzando il Late Binding per istanziare l'oggetto FSO, questo significa che è molto probabile che le costanti non siano disponibili, sempre che ReadOnlyAttr sia una costante definita nel modello ad oggetti di FSO.

Secondo il link che ha postato Ignazio l'impostazione delle proprietà dovrebbe essere un'operazione bit a bit, quindi, nel caso della ReadOnly, visto che il valore dovrebbe essere 1, si può impostare così, magari effettuando un test preliminare dello suo stato attuale

Visual Basic:
If Not (NewFile.Attributes And 1) Then  '<-- Se il file NON è ReadOnly
    NewFile.Attributes = NewFile.Attributes + 1   '<-- lo settiamo
End If

Ovviamente vale l'operazione inversa, sottraendo 1. Comunque conviene sempre testarne lo stato prima, per evitare comportamenti inattesi.

In alternativa, se non è proprio vincolato al FSO, si può usare la molto più intuitiva SetAttr che è propria di VBA:

Visual Basic:
Dim TextFileName As String
TextFileName = "C:\Users\SLDGNZ68E23I754F\Desktop\SCANSIONI NOTIFICHE PER GEDO\NUOVO.TXT"
SetAttr TextFileName, vbReadOnly


TheTruster
 
Ultima modifica:

ezio68

Utente abituale
Original poster
12 Marzo 2023
763
33
28
58
Siracusa
2021
NewFile.Attributes = NewFile.Attributes Or ReadOnlyAttr
buonasera Alfredo, purtroppo la tua soluzione non va. Mi da errore come variabile non dichiarata.

TheTruster @TheTruster :
Visual Basic:
If Not (NewFile.Attributes And 1) Then  '<-- Se il file NON è ReadOnly
    NewFile.Attributes = NewFile.Attributes + 1   '<-- lo settiamo
End If

questa mi restituisce errore metodo o propr. non sopportati dall'oggetto, mentre l'ultima funziona . Vedi codice alla fine :
Visual Basic:
Private Sub CommandButton13_Click()

    Dim FSO As Object
    Dim NewFile As Object
    Dim I As Long
    Dim j As Long
  
  
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set NewFile = FSO.CreateTextFile("C:\Users\info\Desktop\erase\NUOVO.TXT", True)
  
    For I = 1 To 20
        ' aggiunge tre linee ad ogni ciclo
        NewFile.WriteBlankLines (3)
        NewFile.WriteLine Cells(I, 1)
        NewFile.WriteLine "-----"
    Next I
  
    For j = 1 To 20
        NewFile.WriteLine Cells(j, 1)
    Next j
  
    ' soluzione 1 : err ==> variabile non dichiarata
    'NewFile.Attributes = NewFile.Attributes Or ReadOnlyAttr
  
    ' soluzione 2 : err ==> proprietà o metodo non sopportati dall'oggetto
    'If Not (NewFile.Attributes And 1) Then  '<-- Se il file NON è ReadOnly
    '    NewFile.Attributes = NewFile.Attributes + 1   '<-- lo settiamo
    'End If
  
    ' soluzione 3 : ==> ok !
    Dim TextFileName As String
    TextFileName = "C:\Users\info\Desktop\erase\NUOVO.TXT"
    SetAttr TextFileName, vbReadOnly
 
End Sub

ma volevo chiederti, :
- visto che sto studiando il tipo di istruzione che avevi proposto come prima soluzione, perché non va ?
- che vuol dire And messo :
Visual Basic:
If Not (NewFile.Attributes And 1) Then
(mai visto prima) ?
- puoi indicarmi un link con elenco completo delle costanti vbreadonly, vbhide . . . ect. ect . ?

grazie !
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
980
465
95
thetruster.altervista.org
LTSC 2024
prima soluzione, perché non va
La risposta è semplice. Il file è aperto per la scrittura. Non puoi impostarne le proprietà.
Devi prima chiuderlo, poi settare la nuova variabile oggetto e, solo dopo, impostarne gli attributi:

Visual Basic:
'Crei il file, ci scrivi dentro, quindi...

    NewFile.Close '<-- chiudi il file
 
    Set NewFile = FSO.getfile(TextFileName) 'Riassegni il file alla variabile oggetto

    'Adesso puoi impostare gli attributi
    If Not (NewFile.Attributes And 1) Then  '<-- Se il file NON è ReadOnly
        NewFile.Attributes = NewFile.Attributes + 1   '<-- lo settiamo
    End If


- che vuol dire And messo :
Visual Basic:
If Not (NewFile.Attributes And 1) Then
(mai visto prima) ?
L'And in quel modo non è il classico And che significa "e" ma compie un'operazione bit a bit, in pratica controlla che in Attributes sia presente il bit 1 dell'attributo.
In pratica NewFile.Attributes è un numero intero che rappresenta tutte le proprietà del file (nascosto, sola lettura, sistema...) sommate insieme.
Compiendo un And su questo valore si isola il primo bit del numero e se è 1 allora vuol dire che quell'attributo (nel caso di ReadOnly è 1) è impostato.

hai un elenco completo delle costanti vbreadonly,vbhide . . . ect. ect . ?
CostanteValoreDescrizione
vbNormal0Normale (impostazione predefinita).
vbReadOnly1Sola lettura.
vbHidden2Nascosto.
vbSystem4File di sistema.
vbArchive32Archivio (file modificato dall'ultimo backup).

TheTruster
 
Ultima modifica:
  • Like
Reactions: ipolito and Terio

ezio68

Utente abituale
Original poster
12 Marzo 2023
763
33
28
58
Siracusa
2021
Devi prima chiuderlo, poi settare la nuova variabile oggetto e, solo dopo, impostarne gli attributi:
mi restituisce errore autorizzazione negata. Sbaglio qualcosa nel codice ? considera che in questo momento sttrib è di sola lettura e lo voglio riportare a normale . . .
Visual Basic:
Private Sub CommandButton13_Click()

    Dim FSO As Object
    Dim NewFile As Object
    Dim I As Long
    Dim j As Long
 
 
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    Set NewFile = FSO.CreateTextFile("C:\Users\info\Desktop\erase\NUOVO.TXT", True)
 
    For I = 1 To 20
        ' aggiunge tre linee ad ogni ciclo
        NewFile.WriteBlankLines (3)
        NewFile.WriteLine Cells(I, 1)
        NewFile.WriteLine "-----"
    Next I
 
    For j = 1 To 20
        NewFile.WriteLine Cells(j, 1)
    Next j
 
    NewFile.Close
 
    Set NewFile = FSO.getfile("C:\Users\info\Desktop\erase\NUOVO.TXT")
 
     If Not (NewFile.Attributes And 0) Then  '<-- Se il file NON è ReadOnly
        NewFile.Attributes = NewFile.Attributes + 0   '<-- lo settiamo
    End If
 
    'vbNormal (0): Normale
    'vbReadOnly (1): Sola lettura
    'vbHidden (2): Nascosto
    'vbSystem (4): File di sistema
    'vbArchive (32): Archivio
 
End Sub

mi da errore alla riga 10 e allora con un goto salto le istruzioni di scrittura per andare a cambiare attrib ma mi lascia sempre 1 e non 0 :
Visual Basic:
Private Sub CommandButton13_Click()

    Dim FSO As Object
    Dim NewFile As Object
    Dim I As Long
    Dim j As Long
    
    
    Set FSO = CreateObject("SCRIPTING.FILESYSTEMOBJECT")
    On Error GoTo err1
    Set NewFile = FSO.CreateTextFile("C:\Users\info\Desktop\erase\NUOVO.TXT", True)
    
    For I = 1 To 20
        ' aggiunge tre linee ad ogni ciclo
        NewFile.WriteBlankLines (3)
        NewFile.WriteLine Cells(I, 1)
        NewFile.WriteLine "-----"
    Next I
    
    For j = 1 To 20
        NewFile.WriteLine Cells(j, 1)
    Next j
    
    NewFile.Close
    
err1:
    Err.Clear
    Set NewFile = FSO.getfile("C:\Users\info\Desktop\erase\NUOVO.TXT")
    
     If Not (NewFile.Attributes And 0) Then  '<-- Se il file NON è ReadOnly
        NewFile.Attributes = NewFile.Attributes + 0   '<-- lo settiamo
    End If
    
    'vbNormal (0): Normale
    'vbReadOnly (1): Sola lettura
    'vbHidden (2): Nascosto
    'vbSystem (4): File di sistema
    'vbArchive (32): Archivio
  
End Sub
 
Ultima modifica:

TheTruster

Utente abituale
Expert
19 Gennaio 2021
980
465
95
thetruster.altervista.org
LTSC 2024
errore autorizzazione negata
Ovvio, se lo hai impostato a sola lettura con la SetAttrib adesso non puoi aprirlo per scriverci dentro.
Vai sul file con Esplora Risorse, click col destro -> Proprietà e rimuovi l'attributo di sola lettura.

E' per questo che parlavo di un controllo preliminare con la If Not (NewFile.Attributes And 1) ...


Ovviamente vale l'operazione inversa, sottraendo 1. Comunque conviene sempre testarne lo stato prima, per evitare comportamenti inattesi.
Se vuoi farlo da codice, prima di aprirlo per la scrittura:

Visual Basic:
Set NewFile = FSO.getfile("C:\Users\info\Desktop\erase\NUOVO.TXT")
If (NewFile.Attributes And 1) Then  '<-- Se il file E' ReadOnly
    NewFile.Attributes = NewFile.Attributes - 1  '<-- rimuovi l'attributo
End If

TheTruster
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
763
33
28
58
Siracusa
2021
wait please mi correggo, l'errore me lo da alla riga 10 . . .
Set NewFile = FSO.getfile("C:\Users\info\Desktop\erase\NUOVO.TXT") If (NewFile.Attributes And 1) Then '<-- Se il file E' ReadOnly NewFile.Attributes = NewFile.Attributes - 1 '<-- rimuovi l'attributo End If
avevo dimenticato la famosa sottrazione del buon vecchio dos !

scusa ma che significa and nella istruzione :
Visual Basic:
If (NewFile.Attributes And 1) Then

perfetto !
Visual Basic:
 If Not (NewFile.Attributes And 0) Then  '<-- Se il file NON è ReadOnly
        NewFile.Attributes = NewFile.Attributes - 0   '<-- lo settiamo
    End If
 

TheTruster

Utente abituale
Expert
19 Gennaio 2021
980
465
95
thetruster.altervista.org
LTSC 2024
l'errore me lo da alla riga 10 . . .
Ovvio, se lo hai impostato a sola lettura con la SetAttrib adesso non puoi aprirlo per scriverci dentro.

Avevo capito e ti avevo suggerito un controllo preliminare... 😊

da codice, prima di aprirlo per la scrittura:
Visual Basic:
Set NewFile = FSO.getfile("C:\Users\info\Desktop\erase\NUOVO.TXT")
If (NewFile.Attributes And 1) Then  '<-- Se il file E' ReadOnly
    NewFile.Attributes = NewFile.Attributes - 1  '<-- rimuovi l'attributo
End If

scusa ma che significa and nella istruzione :
Visual Basic:
If (NewFile.Attributes And 1) Then
Avevo dato una risposta anche a questo😉

L'And in quel modo non è il classico And che significa "e" ma compie un'operazione bit a bit, in pratica controlla che in Attributes sia presente il bit 1 dell'attributo.
In pratica NewFile.Attributes è un numero intero che rappresenta tutte le proprietà del file (nascosto, sola lettura, sistema...) sommate insieme.
Compiendo un And su questo valore si isola il primo bit del numero e se è 1 allora vuol dire che quell'attributo (nel caso di ReadOnly è 1) è impostato.

Se vuoi approfondire, queste sono le bitwise operations: https://it.wikipedia.org/wiki/Operazione_bit_a_bit

TheTruster
 

ezio68

Utente abituale
Original poster
12 Marzo 2023
763
33
28
58
Siracusa
2021
Ma figurati. Con il controllo preliminare sull'attributo riesci ad aprire il file?
buongiorno a tutti,
ho creato questa piccola routine che ti permette di impostare o togliere l'attributo (in questo caso di sola lettura). Messo al di fuori della sub dove c'è il metodo CreateTextFile, va abbastanza bene; ovviamente nelle proprietà del command, mi imposto la label di partenza per poi poter "giocare" sul "togli/aggiungi" :
Visual Basic:
Dim fSO As Object
    Dim neWfilE As Object
    
    Set fSO = CreateObject("scripting.FileSystemObject")
    Set neWfilE = fSO.getfile("C:\Users\SLDGNZ68E23I754F\Desktop\erase\nuovo.txt")
    
    If Me.CMD_ATTRIB.Caption = "AGGIUNGI ATTRIBUTO DI SOLA LETTURA" Then
            Me.CMD_ATTRIB.Caption = "TOGLI ATTRIBUTO DI SOLA LETTURA"
            If Not (neWfilE.Attributes And 1) Then
                neWfilE.Attributes = neWfilE.Attributes - 1
            End If
        Else
            Me.CMD_ATTRIB.Caption = "AGGIUNGI ATTRIBUTO DI SOLA LETTURA"
            If Not (neWfilE.Attributes And 1) Then
                neWfilE.Attributes = neWfilE.Attributes +1
            End If
    End If

Volevo chiederti, cosa intendi quando mi chiedi se riesco ad aprire il file con il controllo preliminare ?