Newsgroup: it.comp.lang.visual-basic
Titolo: [vb6] Open File impossibile??

A volte, e ripeto, a volte becco l'errore 75 (Path/File access error)
durante la open di un file con vb6.
Ecco il codice incriminato:
  ....
  ..
  ......
  On Error Resume Next
  Kill FileName
  On Error GoTo 0
  Dim nFile As Long
  nFile = FreeFile
  Open FileName For Binary Access Write As #nFile Len = Len(MyRecord)
  ....
  ..
  ......
Le intenzioni sono quelle di salvare su file delle informazioni a video,
quindi il codice vorrebbe eliminare il file prima di scriverlo o
riscriverlo.
L'istruzione Kill funziona, quindi il file non è rimasto aperto, mentre
l'istruzione Open genera l'errore incriminato.
FileName è un file sempre scritto dal mio programma e __non ha__ attributi
strani impostati come read only o altro.
Qualcuno ha idee???
 
Grazie a tutti!!!
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

   Open FileName For Binary Access Write As #nFile Len = Len(MyRecord)
Come è dichiarata MyRecord??
-- 
[CapoBecchino]
Il becchino si sposa: in abito rigorosamente nero, con la sposa accanto 
parte in auto (nera) con le classiche bare attaccate al paraurti posteriore.
La sera, dopo cena, lei lo aspetta semisdraiata su letto, in un negligé 
che sembra una nuvola. Lui si prepara in bagno ed esce impeccabile: 
pigiama nero con i risvolti oro, viso impassibile, passo bilanciato; si 
avvicina alla moglie e dice:
- Signora, vuol baciarlo prima di metterlo dentro? (da Barzellette.it)

 l'istruzione Open genera l'errore incriminato.
E come fai a sapere che la kill funziona se è tra On Error?
Se poi il file realmente non esiste non mi è chiaro come possa dare errori, 
a meno che il persorso non esista (es. percorso di rete con connessione 
traballante) o che tu non abbia i permessi di scrittura.
Ciao 


Spero possa essere utile.
In paarticolare la variabile GridElencoCampi è un xArrayDB dell'Apex
Private Sub Salva_Stampa()
   On Error GoTo ErrorNoResume
   CommonDialog.DialogTitle = "Salva Stampa"
   CommonDialog.Filter = "File di Stampa|*.Prn"
   CommonDialog.InitDir = FindDir(fGetSpecialFolderLocation(CSIDL_PERSONAL) &
"\RUOLI")
   CommonDialog.Flags = cdlOFNOverwritePrompt ' conferma prima di sovrascrivere
un file esistente
   CommonDialog.CancelError = True
   CommonDialog.ShowSave
   ReportFileName = CommonDialog.FileName
   FileCambiato = False
   Call Form°SetTitle
   Call Salva_Stampa_SuFile(ReportFileName)
 
Exit Sub:
ErrorResume:
 Call GestoreErrori.Gestore_Errori(Err)
 Resume Next
ErrorNoResume:
 Call GestoreErrori.Gestore_Errori(Err)
End Sub
Private Function Salva_Stampa_SuFile(FileName As String) As Boolean
    Dim i As Long
    Dim MyRecord As Print_Rec_v33
    Dim rs As New Recordset
 
    On Error GoTo ErrorNoResume
 
    i = 0
    GridElencoCampi.MoveNext ' forzo l'update
    GridElencoCampi.Update
    Err.Clear
 
    Dim r1 As Long
    Dim r2 As Long
    Dim c As Long
'-----------------------------------------------------------------------
' -- ECCO IL CODICE POSTATO IN PRECEDENZA --
'.............................................................................................
    On Error GoTo ErrorResume
    Kill FileName
    On Error GoTo ErrorNoResume
    Dim nFile As Long
        nFile = FreeFile
    Open FileName For Binary Access Write As #nFile Len = Len(MyRecord)
'-----------------------------------------------------------------------
    On Error GoTo ErrorResume '+<ri438>
    Dim MyRecordsSetting() As Print_Rec_v33
    For i = 0 To ElencoCampi.UpperBound(1) - 1
      With MyRecord
        .Alias = ElencoCampi(i, 0)
        .Field = ElencoCampi(i, 1)
        .Tabella = ElencoCampi(i, 2)
        .Order = ElencoCampi(i, 3)
 
        If PrintVarSetting.TipoReport = 0 Then
          .SpezzaturaC = ElencoCampi(i, 4)
          .SpezzaturaR = ElencoCampi(i, 5)
          .SaltoPaginaSuSpezzaturaR = ElencoCampi(i, 6)
          .Totale = ElencoCampi(i, 7)
          .Wrap = ElencoCampi(i, 18)
          .GridColWidth = ElencoCampi(i, 19)
        Else
          .SpezzaturaC = "No"
          .SpezzaturaR = "No"
          .SaltoPaginaSuSpezzaturaR = "No"
          .Totale = "No"
          .Wrap = "No"
        End If
        .Visibile = ElencoCampi(i, 8)
        .CharLung = ElencoCampi(i, 9)
        .Dove = ElencoCampi(i, 10)
         Dim MyError As Long
         MyError = Err.Number
         Err.Clear
         .Tipo =
DBCatalog.Tables(Trim(MyRecord.Tabella)).Columns(Trim(MyRecord.Field)).Type
' RS(Trim(MyRecord.Field)).Type
         If Err Then ' nel caso sia un campo costante
           Err.Clear
           .Tipo = ElencoCampi(i, 17)
         End If
         Err.Number = MyError + Err.Number
        .NullValue = "'" & ElencoCampi(i, 11) & "'"
        .Formatting = "'" & ElencoCampi(i, 12) & "'"
        .MidStart = Val(ElencoCampi(i, 13))
        .MidLength = Val(ElencoCampi(i, 14))
        If PrintVarSetting.TipoReport = 0 And Left(ElencoCampi(i, 15), 1) = "" Then
          .CharFill = "' '"
        Else
          .CharFill = "'" & Left(ElencoCampi(i, 15), 1) & "'"
        End If
        .Alignment = Val(ElencoCampi(i, 16))
      End With
 
      If Err = 0 Then
        Put #nFile, , MyRecord
      Else
        Dim s As String: s = "" '+<LogWritingPrn>
        s = UCase(ElencoCampi(i, 0)) '+<LogWritingPrn>
        modMovLog.W°Append " Errore n. " & Err.Number & " " & Err.Description & " al
campo " & s & " (riga " & i + 1 & ")" '+<LogWritingPrn>
        Err.Clear
        Exit For
      End If
    Next i
 
    Set GridElencoCampi.Array = ElencoCampi
    GridElencoCampi.ReBind
    Close #nFile
    Salva_Stampa_SuFile = True
Exit Function:
ErrorResume:
  Call GestoreErrori.Gestore_Errori(Err)
  Resume Next
ErrorNoResume:
  Call GestoreErrori.Gestore_Errori(Err)
  Close #nFile
  Salva_Stampa_SuFile = False
End Function



Ecco qua:
    Public Type Print_Rec_v33
        Alias As String * 30
        Field As String * 50
        Tabella As String * 50
        Order As String * 4
        Totale As String * 2
        SpezzaturaC As String * 2
        SpezzaturaR As String * 2
        Visibile As String * 2
        CharLung As String * 3
        Dove As String * 200
        Tipo As Long
        SaltoPaginaSuSpezzaturaR As String * 2
        CharFill As String * 3
        Formatting As String * 50
        MidStart As Integer
        MidLength As Integer
        Alignment As Byte
        NullValue As String * 50
        Wrap As String * 2
        GridColWidth As Single
    End Type
 
    Dim MyRecord As Print_Rec_v33


 Posta il codice con cui popoli FileName dopo la chiusura del CommonDialog.
E magari anche il valore di FileName :)
Ciao 


Premesso che ho un file di log che mi permette di vedere cosa ha fatto
l'utente, il file in oggetto viene aperto con la common dialog (quindi
esiste) da un disco locale e in una cartella con tutti i diritti del caso
(in particolare dalla cartella "my documents"). Successivamente l'istruzione
Open manda in crash l'applicazione che quindi termina. A questo punto il
file non è presente sul disco, quindi la kill ha funzionato bene (credo).



ma.... potrebbe essere che provo a fare la open quando ancora il sistema
operativo non ha realmente terminato l'istruzione kill?


 (in particolare dalla cartella "my documents").
Posta il codice con cui popoli FileName dopo la chiusura del 
CommonDialog.
Ciao
Alberto
-- 
I have a dream that my four little children
will one day live in a nation where they
will not be judged by the color of their skin
but by the content of their character.