2012-07-02 47 views
7

Có phương pháp xác minh rằng tệp đang mở không? Điều duy nhất tôi có thể nghĩ đến là Try/Catch để xem liệu tôi có thể bắt ngoại lệ mở tệp hay không nhưng tôi đã tìm ra phương thức có sẵn để trả về true/false nếu tệp đang mở.VB.NET Kiểm tra xem tệp có mở trước khi tiếp tục đọc/ghi không?

Hiện đang sử dụng System.IO và mã sau trong lớp có tên Wallet.

Private holdPath As String = "defaultLog.txt" 
    Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite) 
    Private file As New StreamWriter(_file) 

    Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal 
     Try 
      file.WriteLine("testing") 
      file.Close() 
     Catch e As IOException 
      'Note sure if this is the proper way. 
     End Try 

     Return 0D 
    End Function 

Mọi con trỏ sẽ được đánh giá cao! Cảm ơn bạn!!

+0

Đối phó với File.GetLastAccessTime() có thể? –

+1

Không có cách nào trực tiếp để phát hiện tệp được mở. – coder

+1

Đây là những gì tôi đã yêu cầu http://stackoverflow.com/questions/6706312/how-to-check-if-the-text-file-is-open-and-close-the-text-file và nhận được câu trả lời – coder

Trả lời

14
Private Sub IsFileOpen(ByVal file As FileInfo) 
    Dim stream As FileStream = Nothing 
    Try 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
     stream.Close() 
    Catch ex As Exception 

     If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then 
      ' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data 
     End If 
    End Try 
End Sub 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
+2

Giải pháp tuyệt vời. Tôi chỉ cần thêm rằng bạn cần phải chắc chắn stream.close() trong trường hợp không có ngoại lệ, vì vậy chương trình có thể tiếp tục mà không có vấn đề gì. – mlerley

+0

Nó nói Marshal không được khai báo. –

+2

@CaryBondoc 'Imports System.Runtime.InteropServices;' để sửa lỗi * Nguyên soái không được khai báo * vấn đề. ** Mẹo: ** 'Nguyên soái 'sẽ có gạch dưới màu xanh nhỏ, di chuột qua phần này và nó sẽ cho bạn gợi ý về những gì sai! –

1

Dường như hai đề xuất từ ​​MSDN forum posting cả hai đều liên quan đến việc cố gắng mở tệp.

Điều đầu tiên tương tự như những gì bạn đang làm bây giờ và thứ hai liên quan đến việc sử dụng chức năng Windows API (CreateFile) và kiểm tra xem có xử lý không hợp lệ có nghĩa là tệp đang được sử dụng hay không. Trong cả hai trường hợp, họ dựa vào điều kiện lỗi để xác định xem tệp có đang mở hay không. Tóm lại, theo tôi, phương pháp bạn đang sử dụng là chính xác vì có không phải là thuộc tính System.IO.File.IsOpen.

+1

Xin chào Mark, tôi chắc chắn rằng bạn biết rằng đó là thông lệ trong các câu trả lời StackOverflow để bao gồm tóm tắt nội dung của liên kết hoặc nội dung nổi bật trả lời cụ thể câu hỏi. Mục tiêu của các trang web SE là trở thành một nguồn tài nguyên tri thức, về các câu trả lời, trong nhiều năm tới. Với câu trả lời chỉ có liên kết, op phải đào thông qua một tài nguyên khác để tìm câu trả lời mà người đó có thể không chắc chắn. Quan trọng nhất, nếu liên kết của bạn đã từng bị phá vỡ, câu trả lời của bạn là vô dụng đối với bất kỳ ai truy cập trang này trong tương lai. Chúc mừng cho liên kết tho! –

+1

@JeremyThompson Tôi biết điều đó và tôi làm. Trong trường hợp này, tôi đã quyết định ** có ý thức ** không dán bất kỳ mã nào. Tôi đã không cố gắng cho rằng đây là cách thích hợp để đi. Tôi đã cố gắng để ** trấn an ** OP rằng cách mà ông đã làm nó là chính xác, IMHO. Đề nghị anh ta sử dụng WinApi không phải là những gì tôi đã cố gắng làm và trong trường hợp này là quá mức cần thiết. –

+1

Cảm ơn bạn Mark, tôi đánh giá cao câu trả lời của bạn và tôi đồng ý rằng nó là quá mức cần thiết nhưng nó đã cho tôi một triển vọng tốt về chủ đề này! Cảm ơn một lần nữa :) – Dayan

5

Thật sự không có điểm sử dụng một 'tập tin được sử dụng séc' chức năng kể từ khi bạn vẫn sẽ cần phải có cố gắng nắm bắt để xử lý các trường hợp đó các tập tin không mở. Các tập tin mở có thể thất bại vì nhiều lý do hơn là nó đã được mở.

Ngoài ra, việc sử dụng chức năng để kiểm tra không đảm bảo thành công. Các 'là tập tin trong sử dụng kiểm tra' có thể trả về false chỉ cho các tập tin mở để thất bại với một tập tin đã mở lỗi, bởi vì trong thời gian giữa kiểm tra và cố gắng để mở tập tin nó đã được mở bởi một người nào khác.

+1

thực sự là một nhận xét thay vì trả lời – TruthOf42

Các vấn đề liên quan