2009-10-23 38 views
20

Sử dụng VB.NET, tôi đang cố tạo một tệp văn bản nếu nó không tồn tại hoặc chắp thêm văn bản vào nó nếu tồn tại.Tạo và chắp thêm văn bản vào tập tin txt trong VB.NET

Vì một lý do nào đó, mặc dù nó đang tạo tệp văn bản tôi gặp lỗi khi quy trình không thể truy cập tệp.

Và khi tôi chạy chương trình, nó đang viết văn bản, nhưng làm cách nào để tôi viết nó trên một dòng mới?

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 

Trả lời

20

Hãy thử điều này:

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

Cố định cho VB và xử lý đúng luồng. –

+0

ty Joel, tôi đã làm việc trên phiên bản VB, nhưng máy của bạn trông tốt hơn nhiều –

+0

Điều đó không viết thông báo "Bắt đầu đăng nhập cho ngày hôm nay" khi tệp được tạo, vì vậy nó không làm giống như mã gốc sẽ . – Guffa

6

này nên làm việc cho bạn mà không thay đổi chương trình logic (bằng cách không xuất ra "Bắt đầu lỗi" ở phía trên của mỗi tập tin) như câu trả lời khác làm :) Hãy nhớ để thêm mã xử lý ngoại lệ.

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

Tại sao không chỉ cần sử dụng cuộc gọi đơn giản sau đây (với bất kỳ xử lý ngoại lệ gia tăng)?

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


edited trả lời
này nên trả lời câu hỏi đầy đủ!

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 (và đánh bại tôi khoảng 40 giây), nhưng nó thiếu dòng mới, đó là điểm chính của câu hỏi. –

+0

@Joel Coehoorn -Chúng tôi có thể viết nó xuống để trở thành Thứ Sáu! – stevehipwell

14

Đừng chọn File.Exists() như thế. Trong thực tế, toàn bộ điều là quá phức tạp. Điều này sẽ làm những gì bạn cần:

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 toàn bộ điều xuống hai dòng mã :)

+0

Có, tất nhiên bạn có thể làm cho mã ngắn hơn nếu bạn loại bỏ chức năng. ;) Bạn đã quên thông báo "Bắt đầu nhật ký lỗi cho ngày hôm nay" được ghi vào tệp mới được tạo. – Guffa

+1

+1, có ngắt dòng tôi đã bỏ lỡ! Tho ur dòng đầu tiên nên prob đọc 'Dim strFile Như String = String.Format (" C: \ ErrorLog_ {0: dd-MMM-yyyy} .txt ", DateTime.Today)'. – stevehipwell

+0

Đúng, chắc chắn là Thứ Sáu –

2

Bạn không đóng tập tin sau khi tạo nó, vì vậy khi bạn viết thư cho nó, nó ở sử dụng một mình. Phương thức Create sẽ mở tệp và trả về một đối tượng FileStream. Bạn có thể ghi vào tập tin bằng FileStream hoặc đóng nó trước khi ghi vào nó. Tôi sẽ đề nghị bạn sử dụng phương thức CreateText thay vì trong trường hợp này, vì nó trả về một StreamWriter.

Bạn cũng quên đóng StreamWriter trong trường hợp tệp không tồn tại, vì vậy nó sẽ rất có thể vẫn bị khóa khi bạn cố ghi vào lần tiếp theo. Và bạn quên ghi thông báo lỗi vào tập tin nếu nó không tồn tại.

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 

Lưu ý: Khi bạn bắt ngoại lệ, không bắt lớp cơ sở Ngoại lệ, chỉ bắt những lớp có liên quan. Trong trường hợp này, nó sẽ là những kế thừa từ IOException.

0

Hãy thử nó theo cách này:

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

Trong khi tôi nhận ra đây là một chủ đề lớn tuổi, tôi nhận thấy nếu khối trên là lạc lõng với việc sử dụng:

Sau đây là sửa chữa:

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 
Các vấn đề liên quan