2009-06-26 38 views
20

Tôi có một ứng dụng winforms tải trong các tệp excel để phân tích. Hiện tại, để mở tập tin excel, tập tin không được mở trong excel nếu không thì FileIOException sẽ bị ném ra khi tôi thử tải trong tập tin.Làm cách nào để mở một tệp được mở trong một ứng dụng khác

Điều tôi muốn làm là cho phép ứng dụng của tôi đọc trong tệp ngay cả khi nó mở trong excel thay vì buộc người dùng phải đóng bảng tính trước. Lưu ý rằng các ứng dụng trong câu hỏi chỉ cần đọc các tập tin, không ghi vào nó.

Điều này có khả thi không?

Trả lời

26

Bạn có thể thử qua FileShare.ReadWrite khi mở file:

using (var stream = new FileStream(
     @"d:\myfile.xls", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) 
{ 

} 
+0

Tôi nghĩ cờ FileShare là dành cho trường hợp khác - khi bạn muốn cho phép các ứng dụng khác có quyền truy cập vào tệp – ChrisF

+0

Điều này từ dữ liệu meta: "Chứa các hằng số để kiểm soát loại quyền truy cập các đối tượng System.IO.FileStream khác có thể có cùng một tệp " – ChrisF

+4

Trong trường hợp các trình mở tương lai, FileShare.Read có nghĩa là" các trình mở tương lai có thể mở tệp để đọc ". Trong trường hợp của quá khứ mở, FileShare.Read có nghĩa là "mở tập tin này cho tôi chỉ nếu nó có quá khứ mở mà mở nó cho chỉ đọc". Đó là lý do tại sao FileShare.ReadWrite cần phải được sử dụng ở đây, bởi vì Excel sẽ mở tệp để ghi. –

6

Bạn đang cố gắng mở tệp như thế nào?

Nếu bạn đang cố mở nó để đọc/ghi thì bạn sẽ nhận được ngoại lệ. Nếu bạn đang cố gắng để mở nó chỉ đọc thì bạn sẽ được OK.

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

này sẽ chỉ làm việc nếu Excel đã mở các tập tin với FileShare.Read thiết lập để cho phép các ứng dụng khác (ví dụ của bạn) để có quyền truy cập vào các tập tin. Nếu điều này không được thiết lập thì Excel sẽ mở tệp có quyền truy cập độc quyền. Lưu ý: Tôi không nghĩ rằng đây là trường hợp như bạn có thể mở một tập tin Excel (trong Excel) để đọc nếu ai đó có nó mở để chỉnh sửa.

CẬP NHẬT - OK Tôi đã không kiểm tra điều này đúng cho đến sau khi nhận xét của darin. Bạn cần cờ FileShare.ReadWrite bất chấp sự trợ giúp cho biết rằng nó dành cho trình mở tệp tiếp theo. Thậm chí không FileShare.Read là đủ tốt, mà tôi thấy thậm chí còn tồi tệ hơn.

+0

Điều này không đúng. Sử dụng FileShare.Read có nghĩa là: "chỉ mở tệp này cho tôi nếu bất kỳ trình mở nào trước đó đã mở tệp đó để đọc". đó không phải là trường hợp vì Excel đã mở nó để viết. –

+2

@darin - Tôi không sử dụng FileShare. – ChrisF

+0

Câu trả lời hay. Thật vậy, các tệp Excel không được mở với quyền truy cập độc quyền, vì vậy phương pháp này là hoàn toàn có thể. – Noldorin

0

Hãy thử làm một bản sao của tập tin đã mở ra, đọc nó và loại bỏ nó. Để kiểm tra xem tệp đã được mở chưa, hãy thử đọc và xử lý ngoại lệ bằng cách sao chép, đọc, hủy.

1

có thể đọc sổ làm việc trong khi Excel mở chúng. Đây là mã chúng tôi sử dụng để làm điều đó (lưu ý rằng chúng tôi khóa toàn bộ tập tin sau khi mở cửa để giữ Excel hoặc bất kỳ ứng dụng khác từ văn bản trong khi chúng tôi đang ở giữa đọc):

stream = new System.IO.FileStream(path, 
    System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, 
    System.IO.FileShare.ReadWrite, 
    SG.CompoundDocumentIO.Storage.OpenBufferLength); 
try 
{ 
    stream.Lock(0, stream.Length); 
} 
catch 
{ 
    // .NET 1.1 requires cast to IDisposable 
    ((IDisposable)stream).Dispose(); 
    throw; 
} 

Disclaimer: Tôi sở hữu SpreadsheetGear LLC

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