2009-10-23 11 views
20

Utilizzando VB.NET, sto cercando di creare un file di testo se non esiste o di aggiungervi del testo se esiste.Creazione e aggiunta di testo a file txt in VB.NET

Per qualche motivo, sebbene si stia creando il file di testo, viene visualizzato un errore che indica che il processo non può accedere al file.

E quando eseguo il programma sta scrivendo del testo, ma come posso farlo scrivere su una nuova riga?

Dim strFile As String = "C:\ErrorLog_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt" 

Dim sw As StreamWriter 
Dim fs As FileStream = Nothing 

If (Not File.Exists(strFile)) Then 
    Try 
     fs = File.Create(strFile) 
     sw = File.AppendText(strFile) 
     sw.WriteLine("Start Error Log for today") 

    Catch ex As Exception 
     MsgBox("Error Creating Log File") 
    End Try 
Else 
    sw = File.AppendText(strFile) 
    sw.WriteLine("Error Message in Occured at-- " & DateTime.Now) 

    sw.Close() 
End If 

risposta

20

Prova questo:

Dim strFile As String = "yourfile.txt" 
Dim fileExists As Boolean = File.Exists(strFile) 
Using sw As New StreamWriter(File.Open(strFile, FileMode.OpenOrCreate)) 
    sw.WriteLine(_ 
     IIf(fileExists, _ 
      "Error Message in Occured at-- " & DateTime.Now, _ 
      "Start Error Log for today")) 
End Using 
+1

Risolto per VB e per smaltire correttamente il flusso. –

+0

ty Joel, stavo lavorando sulla versione VB, ma la tua sembra molto meglio –

+0

Questo non scrive il messaggio "Avvia log degli errori per oggi" quando viene creato il file, quindi non fa lo stesso del codice originale . – Guffa

6

Questo dovrebbe funzionare per voi senza cambiare la logica del programma (da non output "errore di avvio" sulla parte superiore di ogni file) come le altre risposte non :) ricordarsi di aggiungere il codice di gestione delle eccezioni.

Dim filePath As String = String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy")) 

Dim fileExists As Boolean = File.Exists(filePath) 

Using writer As New StreamWriter(filePath, True) 
    If Not fileExists Then 
     writer.WriteLine("Start Error Log for today") 
    End If 
    writer.WriteLine("Error Message in Occured at-- " & DateTime.Now) 
End Using 
3

perché non utilizzare la seguente chiamata semplice (con qualsiasi gestione delle eccezioni aggiunto)?

File.AppendAllText(strFile, "Start Error Log for today")


RISPOSTA A CURA
Questo dovrebbe rispondere pienamente alla domanda!

If File.Exists(strFile) 
    File.AppendAllText(strFile, String.Format("Error Message in Occured at-- {0:dd-MMM-yyyy}{1}", Date.Today, Environment.NewLine)) 
Else 
    File.AppendAllText(strFile, "Start Error Log for today{0}Error Message in Occured at-- {1:dd-MMM-yyyy}{0}", Environment.NewLine, Date.Today) 
End If 
+0

+1 (e mi ha battuto di circa 40 secondi), ma manca la nuova linea, che è il punto principale della domanda. –

+0

@Joel Coehoorn -Possiamo scrivere fino a venerdì! – stevehipwell

14

Non selezionare File.Exist() come quello. In realtà, il tutto è troppo complicato. Questo dovrebbe fare quello che ti serve:

Dim strFile As String = String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy")) 
File.AppendAllText(strFile, String.Format("Error Message in Occured at-- {0}{1}", DateTime.Now, Environment.NewLine)) 

Got il tutto fino a due righe di codice :)

+0

Sì, ovviamente puoi ridurre il codice se rimuovi la funzionalità. ;) Hai dimenticato il messaggio "Avvia registro errori per oggi" che è stato scritto nel file appena creato. – Guffa

+1

+1, l'interruzione di linea mi è sfuggita! La prima riga dovrebbe leggere 'Dim strFile As String = String.Format (" C: \ ErrorLog_ {0: dd-MMM-yyyy} .txt ", DateTime.Today)'. – stevehipwell

+0

Sì, è sicuramente venerdì –

2

Non hai chiude il file dopo averlo creato, in modo che quando si scrive ad esso, è in usa da solo. Il metodo Create apre il file e restituisce un oggetto FileStream. Scrivi sul file usando FileStream o chiudilo prima di scriverlo. Ti suggerirei di utilizzare il metodo CreateText invece in questo caso, poiché restituisce StreamWriter.

Si è inoltre dimenticato di chiudere StreamWriter nel caso in cui il file non esistesse, quindi molto probabilmente sarebbe ancora bloccato quando si proverebbe a scrivere su di esso la volta successiva. E hai dimenticato di scrivere il messaggio di errore nel file se non esisteva.

Dim strFile As String = "C:\ErrorLog_" & DateTime.Today.ToString("dd-MMM-yyyy") & ".txt" 
Dim sw As StreamWriter 
Try 
    If (Not File.Exists(strFile)) Then 
     sw = File.CreateText(strFile) 
     sw.WriteLine("Start Error Log for today") 
    Else 
     sw = File.AppendText(strFile) 
    End If 
    sw.WriteLine("Error Message in Occured at-- " & DateTime.Now) 
    sw.Close() 
Catch ex As IOException 
    MsgBox("Error writing to log file.") 
End Try 

Nota: quando si cattura eccezioni, non intercettare l'eccezione classe base, prendere solo quelli che sono releveant. In questo caso sarebbero quelli che ereditano da IOException.

0

Prova questo modo:

Dim filePath As String = 
    String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy")) 

if File.Exists(filePath) then 

Using writer As New StreamWriter(filePath, True) 
writer.WriteLine("Error Message in Occured at-- " & DateTime.Now) 

Else 
writer.WriteLine("Start Error Log for today") 
End Using 

end if 

0

Mentre realizzo questo è un filo più vecchio, ho notato il blocco if sopra è fuori luogo con utilizzando:

seguito viene corretta:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim filePath As String = 
     String.Format("C:\ErrorLog_{0}.txt", DateTime.Today.ToString("dd-MMM-yyyy")) 
    Using writer As New StreamWriter(filePath, True) 
     If File.Exists(filePath) Then 
      writer.WriteLine("Error Message in Occured at-- " & DateTime.Now) 
     Else 
      writer.WriteLine("Start Error Log for today") 
     End If 
    End Using 
End Sub 
Problemi correlati