Tôi đang gặp sự cố với FileSystemWatcher khi nhiều tệp được đặt vào thư mục đã xem. Tôi muốn phân tích cú pháp tệp ngay khi được đặt trong thư mục. Thông thường, tệp đầu tiên phân tích cú pháp tốt, nhưng thêm tệp thứ hai vào thư mục sẽ gây ra sự cố truy cập. Đôi khi, tệp đầu tiên thậm chí không phân tích cú pháp. Chỉ có một ứng dụng đang chạy và xem thư mục này. Cuối cùng, quá trình này sẽ chạy trên nhiều máy và họ sẽ xem một thư mục được chia sẻ nhưng chỉ có một máy chủ có thể phân tích từng tệp khi dữ liệu được nhập vào cơ sở dữ liệu và không có khóa chính.Lỗi truy cập tệp bằng FileSystemWatcher khi nhiều tệp được thêm vào thư mục
Đây là mã FileSystemWatcher:
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Sau đó, phương pháp mà phân tích các file:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
Khi di chuyển các tập tin thứ hai, nó được bắt
System.IO .IOException: Quá trình không thể truy cập tệp 'C: \ Temp \ TestFile.txt' vì nó đang được sử dụng bởi một tiến trình khác.
Tôi hy vọng sẽ thấy lỗi này nếu nó đang chạy trên nhiều máy nhưng hiện chỉ chạy trên một máy chủ. Không nên có một quá trình khác bằng cách sử dụng tệp này - tôi đã tạo và sao chép chúng vào thư mục khi ứng dụng đang chạy.
Đây có phải là cách thích hợp để thiết lập FileSystemWatcher không? Làm thế nào tôi có thể xem những gì có khóa trên tập tin này? Tại sao nó không phân tích cả hai tệp - tôi có phải đóng FileStream không? Tôi muốn giữ tùy chọn FileShare.None bởi vì tôi chỉ muốn một máy chủ phân tích cú pháp tệp - máy chủ nhận tệp đầu tiên phân tích cú pháp tệp đó.
Các tệp thử nghiệm này rất nhỏ - chỉ một vài dòng văn bản ngắn, do đó không được khóa quá lâu trong khi sao chép. Làm thế nào tôi sẽ lặp lại để kiểm tra xem tập tin đã sẵn sàng để ghi vào? –
Cảm ơn! Tôi xấu hổ vì tôi không thể nghĩ ra một vòng lặp trong khi giải pháp cho điều này - tôi cần đọc phiên bản cập nhật của tệp đầu ra của một ứng dụng khác. Tôi nhận được nhiều sự kiện cho mỗi lần viết - vì vậy tôi đã sử dụng bộ hẹn giờ được đặt lại mỗi lần và đợi X giây trước khi kích hoạt mã đọc tệp được cập nhật. Nhưng sau đó tôi bị mất cập nhật nếu ứng dụng đã viết hai lần trong vòng X giây. – Gishu
+1 Nhưng bạn thực sự cần có thời gian chờ đợi tối đa để quá trình này không bị khóa mãi mãi –