Xem câu hỏi này:
how can you easily check if access is denied for a file in .NET?
Các phiên bản ngắn của câu hỏi đó là bạn không, bởi vì hệ thống tập tin là không ổn định. Chỉ cần cố gắng để mở tập tin và bắt ngoại lệ nếu nó không thành công.
Lý do phương pháp isFileFound
của bạn không hoạt động do cấu trúc FileInfo
bạn đang sử dụng cũng có thể được sử dụng để tạo tệp. Bạn có thể tạo một đối tượng FileInfo với thông tin mong muốn cho một tệp không tồn tại, gọi nó là phương thức .Create()
và bạn đã đặt tất cả các thuộc tính mong muốn cùng một lúc.
tôi nghi ngờ lý do đường dẫn UNC thất bại hoặc là 1) sự cố cấp quyền truy cập vào phần quản trị từ người dùng chạy ứng dụng của bạn, hoặc 2) Biểu tượng $
được ném phương pháp tắt, hoặc là bởi vì nó không phải là đầu vào một cách chính xác hoặc vì một lỗi trong phần thực thi .Exists() cơ bản.
Cập nhật:
Khi tôi gửi đề nghị này, tôi gần như luôn luôn có được một lời phàn nàn về hiệu suất ngoại lệ. Hãy nói về điều đó. Có, xử lý ngoại lệ rất tốn kém: rất đắt tiền. Có vài điều bạn có thể làm trong lập trình chậm hơn. Nhưng bạn biết những gì một vài điều là? Đĩa và mạng I/O.Dưới đây là một liên kết mà chứng tỏ chỉ có bao nhiêu đĩa I/O và mạng I/O chi phí:
https://gist.github.com/jboner/2841832
Latency Comparison Numbers
--------------------------
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns 14x L1 cache
Mutex lock/unlock 25 ns
Main memory reference 100 ns 20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy 3,000 ns
Send 1K bytes over 1 Gbps network 10,000 ns 0.01 ms
Read 4K randomly from SSD* 150,000 ns 0.15 ms
Read 1 MB sequentially from memory 250,000 ns 0.25 ms
Round trip within same datacenter 500,000 ns 0.5 ms
Read 1 MB sequentially from SSD* 1,000,000 ns 1 ms 4X memory
Disk seek 10,000,000 ns 10 ms 20x datacenter roundtrip
Read 1 MB sequentially from disk 20,000,000 ns 20 ms 80x memory, 20X SSD
Send packet CA->Netherlands->CA 150,000,000 ns 150 ms
Nếu suy nghĩ trong nano giây không phải là điều bạn, đây là một liên kết bình thường hóa một chu kỳ CPU như 1 giây và quy mô từ đó:
http://blog.codinghorror.com/the-infinite-space-between-words/
1 CPU cycle 0.3 ns 1 s
Level 1 cache access 0.9 ns 3 s
Level 2 cache access 2.8 ns 9 s
Level 3 cache access 12.9 ns 43 s
Main memory access 120 ns 6 min
Solid-state disk I/O 50-150 μs 2-6 days
Rotational disk I/O 1-10 ms 1-12 months
Internet: SF to NYC 40 ms 4 years
Internet: SF to UK 81 ms 8 years
Internet: SF to AUS 183 ms 19 years
OS virt. reboot 4 s 423 years
SCSI command time-out 30 s 3000 years
Hardware virt. reboot 40 s 4000 years
Physical system reboot 5 m 32 millenia
Lấy ngay cả trường hợp tốt nhất cho trường hợp ngoại lệ, bạn có thể truy cập bộ nhớ ít nhất 480 lần trong khi chờ phản hồi đầu tiên từ đĩa và giả định SSD rất nhanh. Nhiều người trong chúng ta vẫn cần quay đĩa cứng, nơi mọi thứ trở nên tồi tệ hơn nhiều.
Và đó mới chỉ là khởi đầu của câu chuyện. Khi bạn sử dụng .Exists()
, bạn phải chịu thêm chi phí bổ sung (và đó là một bổ sung: bạn phải thực hiện lại công việc đó một lần nữa khi bạn mở tệp) trên mỗi lần thử. Bạn trả chi phí này cho dù tệp tồn tại hay không, vì đĩa vẫn phải tìm kiếm nó trong các bảng tệp của nó. Với phương pháp ngoại lệ, bạn chỉ phải trả thêm chi phí cho việc mở ngăn xếp cuộc gọi trong trường hợp thất bại.
Nói cách khác, có: trường hợp ngoại lệ rất tốn kém. Nhưng so với việc kiểm tra đĩa, nó vẫn còn nhanh hơn: và không chỉ bằng một lề nhỏ. Rất may, điều này không có khả năng thúc đẩy hiệu suất chung của ứng dụng của bạn ... nhưng tôi vẫn muốn đưa ra lý lẽ "ngoại lệ chậm" cho tác vụ cụ thể này.
FYI - Là một bác sĩ đa khoa, tôi cố gắng sử dụng System.IO.Path.Combine (đường dẫn, tên tệp) thay vì chuỗi nối: đường dẫn + tên tệp – Ryan
Thông báo trước: IO.Path.Combine ("D: \ Files", "\ foo.xml") sẽ cung cấp cho bạn "\ foo .xml "và điều tiếp theo bạn biết là bạn đã lưu các tệp vào thư mục gốc. – Tyler