2012-08-17 19 views
8

Tôi phải tạo một chương trình giám sát các thay đổi về kích thước tệp. Tôi đã thực hiện một cửa sổ đơn giản dịch vụ và hệ thống tập tin đồng hồ để tôi bây giờ quen thuộc w/khái niệm. Tôi cũng đã thực hiện một mã mà kiểm tra các filesize (thực hiện nó trong một nút biểu mẫu) nhưng chưa thực hiện trong filesystemwatcher của tôi. Làm cách nào để tạo dịch vụ cửa sổ có trình chỉnh sửa giám sát kích thước tệp? Tôi có phải đặt một bộ kiểm tra tập tin bên trong dịch vụ windows và gọi người quan sát thông qua phương pháp OnStart không?Dịch vụ Windows w/FileSystemWatcher trong C#

Trả lời

14

Nếu bạn đang thực hiện dịch vụ của Window, thì bạn sẽ muốn thực hiện theo chương trình. Tôi thường giữ biểu mẫu ra khỏi các dịch vụ của mình và tạo một giao diện riêng để họ giao tiếp. Bây giờ FileSystemWatcher không có một sự kiện để xem chỉ cho kích thước, vì vậy bạn sẽ muốn tạo một phương thức liên kết với FileSystemWatcher.Changed để kiểm tra các sửa đổi đối với các tệp hiện có. Khai báo và khởi tạo điều khiển trong phương thức OnStart của bạn và kết hợp các sự kiện. Thực hiện bất kỳ mã dọn dẹp nào trong phương thức OnStop của bạn. Nó sẽ giống như thế này:

protected override void OnStart(string[] args) 
{ 
FileSystemWatcher Watcher = new FileSystemWatcher("PATH HERE"); 
Watcher.EnableRaisingEvents = true; 
Watcher.Changed += new FileSystemEventHandler(Watcher_Changed); 
} 

// This event is raised when a file is changed 
private void Watcher_Changed(object sender, FileSystemEventArgs e) 
{ 
// your code here 
} 

Cũng lưu ý, các FileSystemWatcher sẽ bắn ra nhiều sự kiện cho một tập tin duy nhất, vì vậy khi bạn đang gỡ lỗi đồng hồ cho các mẫu để làm việc xung quanh nó.

+0

Vì vậy, tôi không nên thêm bất kỳ mục nào từ hộp công cụ trong cửa sổ dịch vụ .. Cảm ơn! Tôi sẽ thử nó càng sớm càng tốt .. Điều đó thực sự hữu ích –

+0

Tôi sẽ tránh xa nó. Khi bạn đang chạy một dịch vụ, Windows tự nhiên vô hiệu hóa tích hợp biểu mẫu và bạn phải định cấu hình dịch vụ sau khi cài đặt để cho phép nó. Nếu đó là điều mà chỉ có đôi mắt của bạn nhìn thấy, thì nó có thể không phải là một vấn đề lớn nhưng đó là một thói quen tốt để tránh kiểu phát triển đó (vì lý do bảo mật). –

+1

CẬP NHẬT: Trong Windows Vista và Win 7, tùy chọn cho phép tương tác trên màn hình đã bị xóa hoàn toàn. Đã không nhận ra điều này tại thời điểm đăng bài. –

3

Bạn chỉ có thể kích hoạt đối tượng FileSystemWatcher của bạn trong phương pháp OnStart bằng cách thiết lập

EnableRaisingEvents = true; 

Sau đó xử lý sự kiện này. Nên làm vậy.

+0

giá trị mặc định sẽ là đúng – Peru

+1

Có thể. [MSDN] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.enableraisingevents.aspx) - "true nếu thành phần được bật, nếu không, false. Giá trị mặc định là false. Nếu bạn đang sử dụng thành phần trên thiết kế trong Visual Studio 2005, mặc định là đúng. " –

1

bạn có thể tạo một delegate để xử lý những gì đã thay đổi như

myWatcher.Changed += new FileSystemHandler(FSWatcherTest_Changed); 

private void FSWatcherTest_Changed(object sender, 
       System.IO.FileSystemEventArgs e) 
{ 
    //code here for newly changed file or directory 
} 

Và vân vân

Tôi muốn giới thiệu bạn đọc bài viết này http://www.codeproject.com/Articles/18521/How-to-implement-a-simple-filewatcher-Windows-serv

Cũng có đại biểu này on_start phục vụ cửa sổ