2010-09-14 25 views
27

Tôi có một vấn đề nhỏ. Tôi có một công cụ mà nên phân tích một tập tin đăng nhập hàng ngày, tiếc là tập tin đăng nhập này đang được sử dụng bởi quá trình ghi vào nhật ký và tôi không thể ngăn chặn nó.Làm thế nào để bạn đọc một tệp đang được sử dụng?

Thử đầu tiên là tạo bản sao của tệp, cũng không hoạt động.

Có cách nào để tôi đọc văn bản hiện tại của tệp nhật ký, ngay cả khi nó đã được sử dụng?

+1

Bạn đã cố đọc nó như thế nào? – jgauffin

+1

Tùy thuộc vào cách công cụ mở tệp nhật ký. Nếu nó đẹp và sử dụng FILE_SHARE_READ, bạn có thể mở tệp nhật ký để đọc như các áp phích khác đề xuất; nếu không may mắn cho bạn. –

Trả lời

63
using (FileStream stream = File.Open("path to file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     while (!reader.EndOfStream) 
     { 

     } 
    } 
} 

FileAccess chỉ định những gì bạn muốn làm với tệp. FileShare chỉ định những gì KHÁC có thể làm với tệp trong khi bạn sử dụng.

Trong ví dụ trên, bạn có thể mở tệp để đọc trong khi các quy trình khác có thể mở tệp để truy cập đọc/ghi. Trong hầu hết các trường hợp, thao tác này sẽ hoạt động để mở các tệp nhật ký đang được sử dụng.

+2

+1, câu trả lời đúng ở đây. Chỉ định FileShare.ReadWrite là rất quan trọng. Quá trình khác đã đạt được quyền truy cập Ghi, bạn không thể từ chối nó. –

+0

Cảm ơn, điều đó đã hoạt động hoàn hảo! – Feroc

+0

File.OpenRead thực hiện điều này bên trong. –

-2

Tôi khuyên bạn nên BareTail, chúng tôi sử dụng để xem tất cả nhật ký của chúng tôi trong thời gian thực. Cũng hỗ trợ làm nổi bật, rất hữu ích.

+0

hmmm ... có vẻ như OP muốn có một cách lập trình để đọc tệp khi nó đã được mở. = P – Dave

3

Sử dụng File.OpenRead(path), điều này cho phép bạn truy cập luồng chỉ đọc vào tệp; theo cách đó, bạn sẽ không bị làm phiền nếu ứng dụng khác có khóa ghi trên tệp.

+1

Không phải lúc nào cũng đúng, tôi gặp sự cố khi đọc tệp nhật ký bị khóa và tôi đang sử dụng File.OpenRead –

+0

File.OpenRead sẽ không mở tệp khi ứng dụng khác đã mở nó để ghi. Câu trả lời của Tom Vervoort là câu trả lời đúng. – Wout

1

tùy thuộc, bạn đã thử đọc tệp ở chế độ chỉ đọc chưa? bằng một trong những phương pháp tĩnh

System.IO.File.ReadAllText(path) or System.IO.File.ReadAllLines(path) 

họ có thể làm việc nếu có tập tin không bị khóa độc quyền

3

Bạn đang ở lòng thương xót của chương trình được viết các tập tin. Trong Windows, một quá trình có thể mở một tệp để đọc, viết hoặc cả hai, nhưng nó cũng có thể kiểm soát liệu các quy trình khác có thể mở tệp để đọc, viết hoặc cả hai hay không. Nếu quá trình khác đã từ chối bạn quyền đọc nội dung của tệp, thì bạn không thể làm gì với nó.

Nếu bạn kiểm soát mã nguồn của chương trình đang ghi tệp nhật ký, sau đó thay đổi nó để cho phép truy cập đọc bởi các quy trình khác.

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